Pourquoi le XSL fonctions `se termine-avec " et "correspond" à la fois de lancer une erreur?
Je suis la transformation du XML, le fait de renommer chaque élément nommé alt-title
à Running_Head
, à condition que l'attribut alt-title-type
est égal à "en cours d'exécution-tête".
Ainsi, le code ci-dessous est à l'aide de la ligne de <xsl:when test="starts-with(@alt-title-type, 'running-head')">
qui fonctionne bien. Cependant, lorsque je passe à présent à l'un de ces:
<xsl:when test="ends-with(@alt-title-type, 'running-head')">
<xsl:when test="matches(@alt-title-type, 'running-head')">
...cette erreur est levée:
Erreur:XSLTProcessor::transformToXml() [xsltprocessor.transformtoxml]:
xmlXPathCompiledEval: 2 objets à gauche sur la pile.
Donc, il semble que la fonction starts-with
est de travail, où ends-with
et matches
ne le sont pas.
Voici mon XSL, à l'aide de starts-with
, cela semble fonctionner correctement:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="UTF-8" indent="yes" method="xml" />
<!-- Running_Head -->
<xsl:template match="@*|node()">
<xsl:choose>
<xsl:when test="starts-with(@alt-title-type, 'running-head')">
<xsl:element name="Running_Head">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template> <!-- end of Running_Head -->
</xsl:stylesheet>
...et voici le XML est transformé:
<root-node>
<alt-title alt-title-type="running-head">
This is working
</alt-title>
<alt-title alt-title-type="asdfng-head">
asdfasdf
</alt-title>
<alt-title>
asdfasdf
</alt-title>
<alt-title alt-title-type="running-head">
This is also working
</alt-title>
</root-node>
Je suis en train de tester ce à http://xslt.online-toolz.com/tools/xslt-transformation.php, et http://www.xsltcake.com/.
- Merci de poster le code erroné. Que certains autres code œuvres peuvent être d'intérêt, mais n'est souvent pas pertinente dans une solution.
- En utilisant le même format XML comme ci-dessus, puis remplacez dans le fichier XSL les "starts-with" dans
<xsl:when test="starts-with(@alt-title-type, 'running-head')">
soitends-with
oumatches
. - Oui, bien sûr - c'est ce que j'ai fait pour reproduire l'exception. Mais vous le rendre plus facile pour answerers si vous affichez le code problématique, en premier lieu, sans avoir besoin de changer quoi que ce soit. Aussi, vous pouvez éviter les questions idiotes où il s'avère une faute de frappe à la faute (comme si vous aviez tapé
ends-wiith
et de ne pas le remarquer).
Vous devez vous connecter pour publier un commentaire.
Que d'autres personnes l'ont souligné, la plupart de XPath 2.0 fonctions (telles que
matches()
etends-with()
) ne sont pas pris en charge par un processeur XSLT 1.0.En outre, ces fonctions ne sont pas nécessaires à tous dans une transformation qui met en œuvre les exigences actuelles:
lorsque cette transformation est appliquée sur le document XML fourni par le:
le voulait, corriger reault est produit:
Explication:
Bonne utilisation de modèles, de coordonner les motifs et d'écraser les l'identité de la règle.
<xsl:strip-space elements="*"/>
dans cette XSL? Cette bande de l'espace entre les lignes, et pas le blanc-espaces dans la Chaîne elle-même?<xsl:for-each select="root/*[matches(name(.), 'grp')]">
en XSLT 1.0?Seulement XPath 2.0 a la
matches
etends-with
fonctions.Dans XPath 1.0,
ends-with
doit être écritIl n'a pas d'expression régulière de la fonctionnalité, mais peut-être
contient($cible, $sous-chaîne)
est ce que vous voulez si vous utilisez aucune expression régulière métacaractères
<xsl:when test="substring(@alt-title-type, string-length(@alt-title-type) - string-length('running-head') + 1)">
<xsl:when test="'running-head' = substring(@alt-title-type, string-length(@alt-title-type) - string-length('running-head') + 1)">
Je pense. Il regarde à droite! Vous voudrez peut-être mettre'running-head'
dans une variable de sorte que vous ne pouvez pas vous faites une erreur de saisie.running-head-asdf
), mais ça semblait être une bonne idée de le exactement indiquez le nom de l'attribut comme il se doit, que votre exemple n'.<xsl:when test="substring(@alt-title-type, string-length(@alt-title-type) - 11)">
que la longueur de'running-head'
est constante. Mais le code devient moins explicites<xsl:for-each select="root/*[matches(name(.), 'grp')]">
en XSLT 1.0?Vous déclarez votre modèle XSLT 1.0, mais vous êtes à l'aide de la 2.0 fonctions
ends-with
etmatches
. Utiliser une feuille de style XSL 2.0 processeur (ou contourner les fonctions manquantes), et de déclarer votre document XSLT 2.0.Remarque que l'erreur que vous obtenez est une erreur interne du processeur XSL utilisés par ces services (on dirait qu'ils ne gèrent pas correctement fonctions non définies).