Sélection d'attribut d'ancêtre; “../ ..” fonctionne, “ancêtre :: >” ne fonctionne pas

StackOverflow https://stackoverflow.com/questions/259656

  •  06-07-2019
  •  | 
  •  

Question

Je suis en train de parcourir un document XML, de sélectionner tous les éléments et de créer des liens en fonction de l'ancêtre, qui est généralement situé à deux nœuds dans l'arborescence, mais parfois à 3 ou 4 nœuds. Pour la majorité des éléments, utilisez < xsl: value-of select = "translate (../../@ name, $ uc, $ lc) " / > fonctionne très bien, mais pour les cas où l'ancêtre a 3 nœuds ou plus, j'aimerais utiliser < xsl: value-of select = "translate (ancor :: package / @ name, $ uc, $ lc) " / > , mais cela ne fonctionne pas.

J'utilise xsltproc de Ruby pour effectuer mes transformations XSL.

Arbre d'échantillonnage (oui, il contient du XSLT, non, je n'essaie pas de le traiter):

<package name="blork!" xmlns="http://xml.snapin.com/XBL">
  <xsl:template name="doSomething">
    <tokens>
      <token name="text-from-resource" export="public" />
    </tokens>
  </xsl:template>
</package>

Le fichier XSL que j'utilise:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s4="http://xml.snapin.com/XBL">
  <xsl:template match="/">
    <xsl:if test="count(//s4:token) >0">
      <xsl:text>Tokens!</xsl:text>
      <xsl:for-each select="//s4:token">
        <xsl:choose>
          <xsl:when test="@export='global'" />
          <xsl:otherwise>
            <xsl:value-of select="translate(ancestor::s4:package/@name,$uc,$lc)" />
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

Éditer: Ah, à droite, j'ai oublié l'espace de noms sur la sélection. L'analyseur trouve cet ancêtre correctement dans la plupart des cas, mais il ne le trouve toujours pas lorsqu'il y a un noeud xsl: node et que le fichier cible n'a pas d'espace de nom pour xsl. Je préférerais ne pas modifier le fichier cible, car il s'agit du code de production. J'écris juste un outil de code automatique.

Était-ce utile?

La solution

Votre problème est probablement lié à un espace de noms. Vous n’avez pas inclus ceux-ci dans l’arbre d’échantillon - pouvez-vous être un peu plus précis dans ce que vous avez collé? En supposant que le noeud de package se trouve dans le même espace de noms que le noeud de jeton, essayez:

<xsl:value-of select="translate(ancestor::s4:package/@name,$uc,$lc)" />

Vous pouvez également tester uniquement le nom non qualifié, bien qu'il soit plus lent:

<xsl:value-of select="translate(ancestor::*[local-name()='package']/@name,$uc,$lc)" />

Spéc. W3C nom-local () ici .

Autres conseils

Je pense qu'il est impossible de déclarer l'espace de noms pour le préfixe 'xsl' dans le document cible tant que vous utilisez des processeurs XML prenant en charge les espaces de noms. Ne voyez-vous aucune erreur lorsque vous essayez de transformer le document cible avec xsltproc et la feuille de style donnée?

Vous pouvez vérifier quelle version de XSLT est utilisée par vos outils. Je pense que XSLT 1.0 ne prend pas en charge le code "ancestor :: < tag > ..."

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top