Selezione dell'attributo dell'antenato; “../ ..” funziona, “antenato :: < tagname >” no

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

  •  06-07-2019
  •  | 
  •  

Domanda

Sto correndo attraverso un documento XML, selezionando tutti gli elementi e creando collegamenti basati sull'antenato che di solito ha due nodi nella struttura, ma occasionalmente 3 o 4 nodi. Per la maggior parte degli elementi, usando < xsl: value-of select = " translate (../../@ name, $ uc, $ lc) " / > funziona bene, ma per i casi in cui l'antenato ha circa 3 nodi, mi piacerebbe usare < xsl: value-of select = " translate (antenato :: pacchetto / @ nome, $ uc, $ lc) " / > , ma questo non funziona.

Sto usando xsltproc di Ruby per fare le mie trasformazioni XSL.

Albero di esempio (sì, contiene XSLT, no, non sto cercando di elaborarlo):

<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>

L'XSL che sto usando:

<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>

Modifica: Ah, giusto, ho dimenticato lo spazio dei nomi sulla selezione. Il parser trova quell'antenato correttamente per la maggior parte dei casi, ma non riesce ancora a trovarlo quando c'è un nodo xsl: e il file di destinazione non ha uno spazio dei nomi per xsl. Preferirei non modificare il file di destinazione, perché è il codice di produzione --- Sto solo scrivendo uno strumento di autocodifica.

È stato utile?

Soluzione

Il tuo problema è probabilmente legato allo spazio dei nomi. Non li hai inclusi nell'albero di esempio: puoi essere un po 'più preciso in ciò che hai incollato? Supponendo che il nodo del pacchetto si trovi nello stesso spazio dei nomi del nodo token, provare:

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

Puoi anche testare solo il nome non qualificato, anche se sarà più lento:

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

Specifica W3C local-name () qui .

Altri suggerimenti

Penso che non ci sia modo di dichiarare lo spazio dei nomi per il prefisso 'xsl' nel documento di destinazione purché si utilizzino processori XML compatibili con lo spazio dei nomi. Non vedi errori quando provi a trasformare il documento di destinazione con xsltproc e il foglio di stile fornito?

Potresti ricontrollare quale versione di XSLT sta usando i tuoi strumenti. Credo che XSLT 1.0 non supporti " ancestor :: < tag > ... "

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top