2010-09-14 5 views
2

Mon format XML est donné ci-dessous,noeuds Pénétrer dans les pages XSLT

<SAMPLEFORM> 
    <SAMPLE ID='1' TYPE='Normal'> 
     <DATA>1</DATA> 
    </SAMPLE> 
    <SAMPLE TYPE='PageSplitter'> 
     <DATA>N/A</DATA> 
    </SAMPLE> 
    <SAMPLE ID='2' TYPE='Normal'> 
     <DATA>1</DATA> 
    </SAMPLE> 
</SAMPLEFORM> 

Je suis en train de diviser les noeuds en ensembles qui contiennent l'attribut Type='Normal' en définissant la position de départ. La position de fin de l'ensemble de noeuds serait l'occurrence suivante du noeud qui contient l'attribut Type='PageSplitter'.

Existe-t-il un moyen d'obtenir la position d'un nœud sans passer par une boucle for-each? Et comment faire ce qui précède?

+0

Pouvez-vous publier un échantillon de la sortie attendue? Eh bien – Oded

+0

la sortie est rendu en HTML, je suppose que cela pourrait être quelque chose comme, Page suivante – sam123

+0

Si vous transformez en HTML, que voulez-vous dire par « Page suivante »? Veuillez fournir un exemple de sortie dans votre question d'origine et également si vous êtes en mesure d'utiliser XSLT 2.0. –

Répondre

1

Vous n'avez pas besoin de deux types de marqueurs - un seul suffit:

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

    <xsl:key name="kPage" match="SAMPLE[not(@TYPE='Normal')]" 
     use="generate-id(preceding-sibling::SAMPLE[@TYPE='Normal'][1])"/> 

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

<xsl:template match="SAMPLE[@TYPE='Normal']"> 
    <page> 
    <xsl:copy-of select=".|key('kPage', generate-id())"/> 
    </page> 
</xsl:template> 

<xsl:template match="SAMPLE[not(@TYPE='Normal')]"/> 
</xsl:stylesheet> 

lorsque cette transformation est appliquée sur le code XML suivant (celui fourni, fait bien formé, avec un élément plus ajouté, et sans "PAGESPLITTER"):

<SAMPLEFORM> 
    <SAMPLE ID='1' TYPE='Normal'> 
     <DATA>1</DATA> 
    </SAMPLE> 
    <SAMPLE ID='2'> 
     <DATA>2</DATA> 
    </SAMPLE> 
    <SAMPLE ID='3' TYPE='Normal'> 
     <DATA>3</DATA> 
    </SAMPLE> 
</SAMPLEFORM> 

le résultat recherché, est produit correct:

<SAMPLEFORM> 
    <page> 
     <SAMPLE ID="1" TYPE="Normal"> 
      <DATA>1</DATA> 
     </SAMPLE> 
     <SAMPLE ID="2"> 
      <DATA>2</DATA> 
     </SAMPLE> 
    </page> 
    <page> 
     <SAMPLE ID="3" TYPE="Normal"> 
      <DATA>3</DATA> 
     </SAMPLE> 
    </page> 
</SAMPLEFORM> 
+0

+1 bonne solution! Je pense que vous devriez éditer votre sortie malformée ... Ja! –

+0

@Alejandro: Merci d'avoir remarqué cela - Correction du formatage. –

Questions connexes