2012-01-31 2 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

+0

@JPM, я предоставил более стабильный шаблон. –

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

Ah soz! Я только заметил, что вы указали XSLT 1.0, поэтому мой ответ не годится. Я оставлю его опубликованным для любопытных. Мне не разрешено отмечать мой собственный ответ, поэтому кому-то пожалуйста, отметьте это. –

+0

На самом деле это полезно для XSLT 1.0, если у вас есть ExsltStrings. Просто замените функцию tokenize 'Exslt.ExsltStrings: tokenize'. (Я использую Umbraco, по умолчанию используется очень многословный префикс) –