Domanda

frammento di XML:

<AA>
  <BB>foo</BB>
  <CC>bar</CC>
  <DD>baz</DD>
  <EE>bar</EE>
</AA>

Come faccio a selezionare tutti i nodi figlio del <AA> che hanno bar come il suo contenuto? Nell'esempio di cui sopra, vorrei per selezionare <CC> e <EE>. Sto pensando la soluzione è qualcosa di simile:

<xsl:template match="AA">
  <xsl:for-each select="???" />
</xsl:template>
È stato utile?

Soluzione

Una delle soluzioni più semplici alla domanda del PO è la seguente espressione XPath :

*/*[.='bar']

nota, che nessuna istruzione XSLT è coinvolto -. Questo è solo un'espressione XPath , in modo che la questione potrebbe essere etichettato solo XPath

Da qui in poi, si potrebbe usare questa espressione XPath in XSLT in vari modi, come ad esempio per applicare modelli su tutti i nodi selezionati .

Per esempio, sotto è una trasformazione XSLT che prende il documento XML e produce un altro, in cui tutti gli elementi - figli di <AA> il cui contenuto non è uguale a "bar" vengono eliminati:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="AA">
      <xsl:copy>
         <xsl:apply-templates select="*[. = 'bar']"/>
      </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Quando questa trasformazione è applicato sul documento XML originale :

<AA>
    <BB>foo</BB>
    <CC>bar</CC>
    <DD>baz</DD>
    <EE>bar</EE>
</AA>

il risultato voluto è prodotto :

<AA>
   <CC>bar</CC>
   <EE>bar</EE>
</AA>

Do atto :

In un modello di partita che di solito non abbiamo bisogno di specificare un'espressione XPath assoluta, ma solo un parente uno, quindi la piena espressione XPath è naturalmente semplificato per questo schema partita:

*[. = 'bar']
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top