2014-12-26 191 views
4

我在XSLT中嘗試這個任務:將嵌套元素轉換爲嵌套XML格式。使用XSLT從嵌套轉換爲扁平化XML結構

轉換自:

<example> 
<value> 
    aaa 
    <value> 
    bbb 
     <value> 
     ccc 
     </value> 
    </value> 
</value> 
</example> 

要:

<example> 
    <value>aaa</value> 
    <value>aaa</value> 
    <value>bbb</value> 
    <value>bbb</value> 
    <value>ccc</value> 
    <value>ccc</value> 
</example> 

我一直試圖找到解決辦法,但我只有這個:

<xsl:template match="/"> 
     <exmaple> 
     <xsl:apply-templates/> 
     </exmaple> 
    </xsl:template> 

    <xsl:template match="//value/text()"> 

    <value><xsl:value-of select="."/></value> 
    <value><xsl:value-of select="."/></value> 

    </xsl:template> 

結果(問題帶空標籤):

<exmaple> 
<value> 
aaa 
</value><value> 
aaa 
</value><value> 
bbb 
</value><value> 
bbb 
</value><value> 
ccc 
</value><value> 
ccc 
</value><value> 
</value><value> 
</value><value> 
</value><value> 
</value> 
</exmaple> 

回答

1

試試這個模板與XPath的//value/text()[1]

<xsl:template match="//value/text()[1]"> 
    <value><xsl:value-of select="." /></value> 
    <value><xsl:value-of select="." /></value> 
</xsl:template> 

的技巧是,你需要從每一個<value>選擇第一個文本節點,因爲text()將返回他們的集合。

2
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output indent="yes"/> 

    <xsl:template match="example"> 
     <xsl:copy> 
      <xsl:apply-templates select=".//value"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="value"> 
     <xsl:copy> 
      <xsl:value-of select="normalize-space(text())"/> 
     </xsl:copy> 
     <xsl:copy> 
      <xsl:value-of select="normalize-space(text())"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet>