一XSLT 2.0解決方案:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="value">
<xsl:for-each select="tokenize(., ',')">
<value><xsl:value-of select="."/></value>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
此變換適用於t他提供了XML文檔(更正!!!!良構):
<fields>
<field name="example">
<value>example,i,am,new,to,xslt</value>
</field>
</fields>
有用,正確的結果產生:
<fields>
<field name="example">
<value>example</value>
<value>i</value>
<value>am</value>
<value>new</value>
<value>to</value>
<value>xslt</value>
</field>
</fields>
II。 XSLT 1.0溶液:
<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:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="value" name="tokenize">
<xsl:param name="pText" select="."/>
<xsl:if test="string($pText)">
<value>
<xsl:value-of select=
"substring-before(concat($pText, ','), ',')"/>
</value>
<xsl:call-template name="tokenize">
<xsl:with-param name="pText" select=
"substring-after($pText, ',')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
當該變換是在相同的XML文檔(上文)施加相同的正確的結果產生:
<fields>
<field name="example">
<value>example</value>
<value>i</value>
<value>am</value>
<value>new</value>
<value>to</value>
<value>xslt</value>
</field>
</fields>
說明:
使用身份規則「按原樣」複製所有內容。
覆蓋(身份模板的)模板匹配value
。
在解決方案I中 - 適當使用標準XPath 2.0函數tokenize()
。
在解決方案II中 - 使用命名模板執行某些操作,因爲在XPath 1.0/XSLT 1.0中沒有定義tokenize()
。
在解決方案II中,爲了方便起見,我們將匹配value
的模板與執行逗號 - 標記化的命名模板合併。