2011-02-07 21 views
1

我有一個XML元素:XSLT:讀值列表或數組

<myElement>item1 item2 item3</myElement> 

我想使用XSLT把它轉換爲:

<newElement>item1</newElement> 
<newElement>item2</newElement> 
<newElement>item3</newElement> 

如何woudl的XSLT看?我更感興趣的是如何循環myElement的列表,或者如何讓它成爲一個列表或變量。

請指教。

+0

剛一式兩份http://stackoverflow.com/questions/136500/does-xslt-have-a-split-function – 2011-02-07 17:22:16

回答

2

這種轉變

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


<xsl:template match="text()[contains(., ' ')]" name="tokenize"> 
    <xsl:param name="pText" select="."/> 

    <xsl:if test="string-length($pText)"> 
    <newElement> 
    <xsl:value-of select= 
    "substring-before(concat($pText,' '),' ')"/> 
    </newElement> 

    <xsl:call-template name="tokenize"> 
    <xsl:with-param name="pText" select= 
    "substring-after($pText,' ')"/> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<myElement>item1 item2 item3</myElement> 

產生想要的,正確的結果

<newElement>item1</newElement> 
<newElement>item2</newElement> 
<newElement>item3</newElement> 
1

在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:template match="myElement"> 
    <xsl:for-each select="tokenize(., '\s+')"> 
    <newElement><xsl:value-of select="."/></newElement> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet>