Comment puis-je vérifier l'existence d'un fichier externe avec XSL?
J'ai trouvé beaucoup d'exemples qui font référence à Java et C pour cela, mais comment dois-je ou puis-je vérifier l'existence d'un fichier externe avec XSL.
Tout d'abord, je me rends compte que ce n'est qu'un extrait, mais il fait partie d'une énorme feuille de style, donc je suis en espérant que cela suffit pour montrer mon problème.
<!-- Use this template for Received SMSs -->
<xsl:template name="ReceivedSMS">
<!-- Set/Declare "SMSname" variable (local, evaluates per instance) -->
<xsl:variable name="SMSname">
<xsl:value-of select=" following-sibling::Name"/>
</xsl:variable>
<fo:table font-family="Arial Unicode MS" font-size="8pt" text-align="start">
<fo:table-column column-width=".75in"/>
<fo:table-column column-width="6.75in"/>
<fo:table-body>
<fo:table-row>
<!-- Cell contains "speakers" icon -->
<fo:table-cell display-align="after">
<fo:block text-align="start">
<fo:external-graphic src="../images/{$SMSname}.jpg" content-height="0.6in"/>
Ce que je voudrais faire, c'est de mettre dans une instruction "if", environnant les {$SMSname}.jpg
ligne. Qui est:
<fo:block text-align="start">
<xsl:if test="exists( the external file {$SMSname}.jpg)">
<fo:external-graphic src="../images/{$SMSname}.jpg" content-height="0.6in"/>
</xsl:if>
<xsl:if test="not(exists( the external file {$SMSname}.jpg))">
<fo:external-graphic src="../images/unknown.jpg" content-height="0.6in"/>
</xsl:if>
</fo:block>
En raison de "regroupement", etc., Je suis à l'aide de XSLT 2.0. J'espère que c'est quelque chose qui peut être fait. J'espère même plus que c'est quelque chose de simple.
Comme toujours, merci d'avance pour toute aide.
LO
Il semble qu'il sera possible avec EXPath sur les extensions de fichier de package (expath.org/spec/file)...
OriginalL'auteur LOlliffe | 2010-05-26
Vous devez vous connecter pour publier un commentaire.
Non, cela ne peut être fait à l'aide de XSLT 2.0/XPath 2.0.
Le XSLT 2.0 fonction unparsed-texte - () ne convient que pour la localisation des fichiers de texte, et même si un fichier texte avec le spécifie l'URI existe cette fonction peut retourner false(), car il faut aussi lire le contenu du fichier et vérifier qu'elle ne contient que les caractères autorisés.
De la spec:
"La unparsed-texte-disponibles en fonction détermine si un appel sur le unparsed-texte en fonction avec des arguments identiques doit retourner une chaîne de caractères.
Si le premier argument est une séquence vide, la fonction renvoie la valeur false. Si le second argument est une séquence vide, la fonction se comporte comme si le second argument a été omis.
Dans d'autres cas, la fonction renvoie la valeur true si un appel sur unparsed-texte avec les mêmes arguments serait un succès, et false dans le cas d'un appel sur unparsed-texte, avec les mêmes arguments pourraient échouer avec un non-récupérables erreur dynamique.
Remarque:
Cela nécessite que le unparsed-texte-fonction disponible devrait en fait d'une tentative de lecture de la ressource identifiée par l'URI, et vérifier qu'il est correctement codé et ne contient pas de caractères non valides dans le XML
"
Fin de citation.
OriginalL'auteur Dimitre Novatchev
Pour quelqu'un d'autre qui pourrait trébucher sur cette vieille question, par rassembler des informations provenant de diverses sources sur l'internet, je suis venu avec cette XSLT2 fonction qui utilise une extension Java pour vérifier si un fichier existe:
Vous pouvez ensuite utiliser la fonction comme ceci:
Cela fonctionne au moins avec Saxon 9.1.0.5 J ne l'ai pas testé avec d'autres processeurs XSLT.
Note: Si le fichier dont l'existence vous êtes de la vérification d'un fichier XML et que vous utilisez XSLT2, vous pouvez également utiliser le haut-
doc-available()
fonction:Error at xsl:sequence on line 32 column 66 of propertize-opf.xslt: XPST0017 XPath syntax error at char 12 on line 32 near {...xists(file:new($absolute-ur...}: Cannot find a matching 1-argument function named {java.io.File}new(). For diagnostics on calls to Java methods, use the -TJ command line option or set the Configuration property FeatureKeys.TRACE_EXTERNAL_FUNCTIONS
Êtes-vous sûr que vous êtes en passant
base-uri()
comme deuxième argumentjava:file-exists()
? Comme dans:<xsl:if test="java:file-exists($filename, base-uri())"> <!-- ... ---> </xsl:if>
. Aussi, notez que cette fonction ne fonctionne que sur XSLT2.0.OriginalL'auteur Eero Helenius
EDIT: Utiliser unparsed-texte-fonction disponible. Il fait partie de xslt 2.0, mais pas XQuery ou autonome XPath.
J'ai quitté ma précédente réponse ici, donc vous pouvez suivre le sentier de l'incertitude...
Je ne crois pas qu'il existe un moyen de le faire en XSLT utilisant les fonctions standard. Vous pouvez le faire à l'aide de fonctions d'extension, comme décrit ici, pour java.
Il est le unparsed-texte-disponible fonction, mais je ne suis pas sur si c'est une fonction standard. Il y a un exemple de son utilisation à Zvon. Le unparsed-texte disponible est mentionné ici comme faisant partie de xslt 2.0, et est pris en charge dans le Saxon.
OriginalL'auteur mdma
Un projet de Module de fichier EXPath spécification serait en charge du système de fichiers, des fonctions telles que cette (
file:exists()
dans la spec) comme standard de fonctions d'extension XPath. Il n'y a pas encore un XSLT de mise en œuvre, mais sa vaut la peine de regarder.OriginalL'auteur pgfearo
Dans le cas où quelqu'un d'autre en a besoin et qui est à l'aide de fop, je voudrais partager cette réponse depuis il a travaillé pour moi comme un charme.
J'ai trouvé une solution:
et il fonctionne indépendamment de XSLT 1.0 ou 2.0
OriginalL'auteur elysch
Il ne peut pas uniquement être fait par le standard XSLT, vous devez utiliser une extension de la fonction ou de certains ennuyeux solution de contournement. Il y a deux méthodes à l'aide de fonctions d'extension: utilisation de la norme java/.NET pour des fonctions personnalisées (fonctionne avec certaines versions de Saxon, AltovaXML, et autres), ou de l'utilisation de processeur spécifique de fonctions d'extension, comme saxon:fichier-last-modified()/saxon:last-modified(). Vous pouvez trouver un exemple de code ici, regarder du stagiaire:file-exists().
Si vous ne pouvez pas utiliser les fonctions d'extension, vous pouvez soit générer un fichier XML externaly qui contient des informations sur votre système de fichiers et les transmettre à votre feuille de style, ou vous pouvez placer des images binaires à l'intérieur de SVG et de l'utilisation fn:doc - ().
OriginalL'auteur Stf
Si vous avez besoin de vérifier l'existence d'un fichier XML, utilisez une entité externe et une ligne doctype:
Puis ajouter l'entité à la feuille de style:
Le processeur délai d'attente si le fichier n'est pas trouvé.
Si vous connaissez les fichiers existent, mais que voulez charger dynamiquement un des beaucoup de, utiliser le
concat
fonction et unchoose/when
bloc:Références
OriginalL'auteur Paul Sweatte
Retour à pgfearo avis.
Pour ceux qui ont besoin de vérifier si un fichier existe ou pas.
fonctionne très bien maintenant.
OriginalL'auteur MypR