2012-04-19 29 views
1

您好,我需要用逗號分隔數據並添加新數據。使用命令分隔數據在xsl中創建新字段

<fields> 
<field name="example"><value>example,i,am,new,to,xslt</value></field> 
<fields> 

我需要這個XML轉換到

<fields> 
<field name="example"><value>example</value><value>i</value>am</value><value>new</value><value>to</value><value>xslt</value></field> 
<fields> 

任何一個可以解釋我是如何能做到這一點使用XSLT

回答

2

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

說明

  1. 使用身份規則「按原樣」複製所有內容。

  2. 覆蓋(身份模板的)模板匹配value

  3. 在解決方案I中 - 適當使用標準XPath 2.0函數tokenize()

  4. 在解決方案II中 - 使用命名模板執行某些操作,因爲在XPath 1.0/XSLT 1.0中沒有定義tokenize()

  5. 在解決方案II中,爲了方便起見,我們將匹配value的模板與執行逗號 - 標記化的命名模板合併。

相關問題