2012-10-20 25 views
6

我有一塊,我想用XSLT轉換XML的。原始的XML使用一些標籤作爲這樣的分隔符:使用XSLT( - 所以只有XSLT 1.0使用xsltproc的)分離器轉換成包裝

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

我需要轉變成一個包裝這些元素,而不是一個格式這一點。所以,我需要它看起來像這樣:

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

我似乎無法設計出實現這一模板。任何人都有什麼想法?

回答

6

這種轉變

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

時所提供的XML文檔應用:

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

產生想要的,正確的結果

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

謝謝!我從來沒有想過用密鑰和生成-ID這樣的。 –

+0

@JeffKing,歡迎您。這是「位置」分組的一種變體。這在XSLT 2.0中更容易完成, –