2012-01-31 66 views
3

我有一個變量$色彩,是一個字符串XSLT 1.0轉換分隔字符串節點設置

<xsl:variable name="colors" select="'red,green,blue,'" /> 

我需要一個新的變量,$ colorElements這是一個節點集

<color>red</color> 
<color>green</color> 
<color>blue</color> 

(這是對的嗎?節點集可以沒有根?)

$colorElements永遠不會直接輸出。我只需要它作爲一個列表變量。

XSLT 1.0除node-set()之外沒有擴展名。

回答

3

用途:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:variable name="colors" select="'red,green,blue,'" /> 

    <xsl:template match="/"> 

    <xsl:variable name="colorElements"> 
     <xsl:call-template name="split"> 
     <xsl:with-param name="pText" select="$colors"/> 
     </xsl:call-template> 
    </xsl:variable> 

    <xsl:for-each select="msxsl:node-set($colorElements)"> 
     <xsl:copy-of select="color"/> 
    </xsl:for-each> 

    </xsl:template> 

    <xsl:template name="split"> 
    <xsl:param name="pText"/> 

    <xsl:variable name="separator">,</xsl:variable> 

    <xsl:choose> 
     <xsl:when test="string-length($pText) = 0"/> 
     <xsl:when test="contains($pText, $separator)"> 
     <color> 
      <xsl:value-of select="substring-before($pText, $separator)"/> 
     </color> 
     <xsl:call-template name="split"> 
      <xsl:with-param name="pText" select="substring-after($pText, $separator)"/> 
     </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
     <color> 
      <xsl:value-of select="$pText"/> 
     </color> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 
+0

爲什麼測試= 「字符串長度($ pText)」,而不僅僅是測試= 「$ pText」? – JPM 2012-01-31 14:34:01

+0

@JPM,我提供了更穩定的模板。 – 2012-01-31 15:09:56

0

這個怎麼樣?:

<?xml version="1.0"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       exclude-result-prefixes="xs"> 
<xsl:output method="xml" indent="yes" encoding="utf-8" /> 
<xsl:variable name="colors" select="'red,green,blue,'" /> 
<xsl:template match="/" name="main"> 
    <csv-to-xml> 
    <xsl:for-each select="tokenize($colors, ',')[position()!=last()]"> 
    <!-- The predicate is needed because of the extraneous comma 
     at the end of the red,green,blue, list. --> 
    <color><xsl:value-of select="." /></color> 
    </xsl:for-each> 
    </csv-to-xml> 
</xsl:template> 
</xsl:stylesheet> 
+0

啊啊!我只注意到你指定了XSLT 1.0,所以我的答案不好。我會把它留給好奇的。我不允許標記自己的答案,所以有人請將其標記出來。 – 2012-02-02 04:07:55

+0

實際上,如果您有ExsltStrings,則它對於XSLT 1.0非常有用。只需將'tokenize'函數替換爲'Exslt.ExsltStrings:tokenize'。 (我使用Umbraco,默認爲非常詳細的前綴) – 2012-10-05 14:03:45