Пример кодирования XSL - PullRequest
0 голосов
/ 23 декабря 2010

Я не эксперт по XSL и борюсь с простой логикой:

У меня есть переменная XSL со значением «A, B, C», я хочу разделить ее и сохранить отдельные значения в трех разных переменных XSL, таких как

X = A
Y = B
Z = C

но иногда он может иметь только одно / два значения или не иметь значений ...

если оно имеет только одно значение, тогда значения переменных должны быть такими, как

X = A
Y =
Z =

если оно не имеет значения, тогда

X =
Y =
Z =

Пожалуйста, помогите мне с кодом XSL для того же

Позволяет сказать:

Теги имеют значение «Test, Demo, Sample», тогда я бы хотел разделить вот так

<xsl:choose>
    <xsl:when test="contains($Tags,',')">
        <xsl:variable name="Tags1">
            <xsl:value-of select="substring-before($Tags,',')" />
        </xsl:variable>
        <xsl:variable name="ATag1">
            <xsl:value-of select="substring-after($Tags,',')" />
        </xsl:variable>
    </xsl:when>
    <xsl:otherwise>
        <xsl:variable name="Tags1"/>
        <xsl:variable name="ATags1"/>
    </xsl:otherwise>
</xsl:choose>

<xsl:choose>
    <xsl:when test="contains($ATags1,',')">
        <xsl:variable name="Tags2">
            <xsl:value-of select="substring-before($ATags1,',')" />
        </xsl:variable>
        <xsl:variable name="ATag2">
            <xsl:value-of select="substring-after($ATags1,',')" />
        </xsl:variable>
    </xsl:when>
    <xsl:otherwise>
        <xsl:variable name="Tags2"/>
        <xsl:variable name="ATags2"/>
    </xsl:otherwise>
</xsl:choose>



<xsl:choose>
    <xsl:when test="contains($ATags2,',')">
        <xsl:variable name="Tags3">
            <xsl:value-of select="substring-before($ATags2,',')" />
        </xsl:variable>
    </xsl:when>
    <xsl:otherwise>
        <xsl:variable name="Tags3"/>
    </xsl:otherwise>
</xsl:choose>

однако это не работает для меня ...

1 Ответ

2 голосов
/ 23 декабря 2010

Вот решение XSLT 2.0 :

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

 <xsl:template match="text()">
  <xsl:variable name="vSeq" select="tokenize(.,',')"/>

  <xsl:variable name="X" select="$vSeq[1]"/>
  <xsl:variable name="Y" select="$vSeq[2]"/>
  <xsl:variable name="Z" select="$vSeq[3]"/>

  <xsl:value-of select=
   "concat('X = ',$X, '&#xA;',
           'Y = ',$Y, '&#xA;',
           'Z = ',$Z, '&#xA;'
           )"
   />
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к следующему документу XML :

<t>A,B,C</t>

желаемый, правильный результат получается :

X = A
Y = B
Z = C

Решение 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:template match="text()">
  <xsl:variable name="X" select="substring-before(.,',')"/>
  <xsl:variable name="Y" select=
   "substring-before(substring-after(.,','),',')"/>
  <xsl:variable name="Z" select=
   "substring-before(substring-after(.,','),',')"/>

  <xsl:value-of select=
   "concat('X = ',$X, '&#xA;',
           'Y = ',$Y, '&#xA;',
           'Z = ',$Z, '&#xA;'
           )"
   />
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к тому же XML-документу (как указано выше), получается требуемый, правильный результат :

X = A
Y = B
Z = B
...