2012-10-20 14 views
6

Mam kawałek XML, który chcę przekształcić z XSLT (przy użyciu xsltproc - tak tylko XSLT 1.0). Oryginalny XML używa znaczników jako separatorów takich jak ten:Użyj XSLT do konwersji separatorów w owijki

<container> 
    <element /> 
    <element /> 
    <separator /> 
    <element /> 
    <element /> 
    <element /> 
    <separator /> 
    <element /> 
</container> 

Potrzebuję przekształcić to w format, który zawija te elementy. Potrzebuję go więc wyglądać tak:

<container> 
    <wrapper> 
    <element /> 
    <element /> 
    </wrapper> 
    <wrapper> 
    <element /> 
    <element /> 
    <element /> 
    </wrapper> 
    <wrapper> 
    <element /> 
    </wrapper> 
</container> 

Po prostu nie mogę zaprojektować szablonu, który to osiągnie. Ktoś tam ma jakieś myśli?

Odpowiedz

6

Ta przemiana:

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

<xsl:key name="kFollowing" match="element" 
      use="generate-id(preceding-sibling::separator[1])"/> 

<xsl:template match="/*"> 
    <container> 
     <xsl:apply-templates select= 
     "element 
      [generate-id() 
      = 
      generate-id(key('kFollowing', 
          generate-id(preceding-sibling::separator[1]) 
          )[1] 
         ) 
      ]"/> 
    </container> 
</xsl:template> 

<xsl:template match="element"> 
    <wrapper> 
    <xsl:copy-of select= 
    "key('kFollowing', 
     generate-id(preceding-sibling::separator[1]) 
     )"/> 
    </wrapper> 
</xsl:template> 
</xsl:stylesheet> 

po naniesieniu na dostarczonych dokumentów XML:

<container> 
    <element /> 
    <element /> 
    <separator /> 
    <element /> 
    <element /> 
    <element /> 
    <separator /> 
    <element /> 
</container> 

produkuje Wanted, poprawny wynik:

<container> 
    <wrapper> 
     <element/> 
     <element/> 
    </wrapper> 
    <wrapper> 
     <element/> 
     <element/> 
     <element/> 
    </wrapper> 
    <wrapper> 
     <element/> 
    </wrapper> 
</container> 
+0

Dzięki! Nie myślałem o używaniu klucza i generowania identyfikatora w ten sposób. –

+0

@JeffKing, Nie ma za co. Jest to wariant grupowania "pozycyjnego". Jest to znacznie łatwiejsze do osiągnięcia w XSLT 2.0, –