2010-04-22 2 views
3

Je veux obtenir le generate-id(.) de tous les nœuds de texte après le nœud <m/> et avant le nœud </n>. Je suis à la recherche de XSL générique et pas étroitement couplé au modèle d'entrée d'échantillon mentionné ci-dessous. Pour tout modèle d'entrée, je veux obtenir les identifiants de tous les nœuds de texte entre le nœud <m/> et <n/>.Comment puis-je sélectionner tous les nœuds de texte entre deux éléments, en utilisant XSL?

entrée de l'échantillon pour une meilleure compréhension:

<a> 
    <b> 
    <c> 
     This is first text node 
    </c> 
    </b> 
    <d> 
    <e> 
     This is my second text node 
    </e> 
    <f> 
     This is my <m/>third text node 
    </f> 
    <g> 
     One more text node 
    </g> 
    <h> 
    <i> 
     This is my fourth text node 
    </i> 
    </h> 
    <j> 
    This is my fifth <n/>text node 
    </j> 
    <k> 
    <l> 
     This is my sixth text node 
    </l> 
    </k>  
</d> 
</a> 

Sortie prévue: Generate id des noeuds de texte avec des valeurs « de troisième noeud texte », « Un autre nœud de texte », « Ceci est mon quatrième noeud texte » , "Ceci est mon cinquième" qui se trouvent entre les nœuds <m/> et <n/>

S'il vous plaît donner vos idées.

+0

Bonne question (+1). Voyez ma réponse pour une solution complète et compacte. :) –

Répondre

4

Cette transformation:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="vtextPostM" select="//text()[preceding::m]"/> 
<xsl:variable name="vtextPreN" select="//text()[following::n]"/> 

<xsl:variable name="vtextBN-MandN" select= 
    "$vtextPostM[count(.|$vtextPreN) = count($vtextPreN)]"/> 

<xsl:variable name="vNL" select="'&#xA;'"/> 
<xsl:variable name="vQ">"</xsl:variable> 

<xsl:template match="/"> 
    <xsl:for-each select="$vtextBN-MandN"> 
    <xsl:value-of select= 
    "concat($vNL, 'Id: ', $vQ, generate-id(), $vQ, 
      'Text: ', $vQ, ., $vQ) 
    "/> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur le document XML fourni, produit correct et je voulais entraîner:

Id: "IDAOZDLB"Text: "third text node 
    " 
Id: "IDAQZDLBIDAQZDLB"Text: " 
     One more text node 
    " 
Id: "IDAUZDLBIDAUZDLB"Text: " 
     This is my fourth text node 
    " 
Id: "IDAYZDLB"Text: " 
    This is my fifth " 

Prenez note l'utilisation de la méthode Kaysian de l'intersection nodale:

$ns1[count(.|$ns2)=count($ns2)] 

sélectionne tous les nœuds appartenant à la fois au jeu de nœuds $ns1 et au jeu de nœuds $ns2.

+0

Merci cela fonctionne parfaitement. – user323719

Questions connexes