使用xslt拆分Tag的值

时间:2012-06-26 12:45:32

标签: xslt xslt-1.0

来源:

  <Data>
     <value>M1,M2,M3,M4,M5,M6</value>
  </Data>

需要将其显示为

输出:

    <ABCD>
        <value1>M1</value1>
        <value2>M2</value2>
        <value3>M3</value3>
        <value4>M4</value4>
        <value5>M5</value5>
        <value6>M6</value6>
    </ABCD>

XSLT:

我实际上想要根据“,”拆分值,并将它们放在不同的变量中。 使用str-split(),我可以将它加载到不同的变量中。

2 个答案:

答案 0 :(得分:3)

此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="/*">
  <ABCD>
    <xsl:apply-templates/>
  </ABCD>
 </xsl:template>

 <xsl:template match="value/text()" name="split">
  <xsl:param name="pText" select="."/>
  <xsl:param name="pOrd" select="1"/>

  <xsl:if test="$pText">
    <xsl:element name="value{$pOrd}">
      <xsl:value-of select=
        "substring-before(concat($pText, ','), ',')"/>
    </xsl:element>

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

应用于提供的XML文档时:

<Data>
    <value>M1,M2,M3,M4,M5,M6</value>
</Data>

生成想要的正确结果

<ABCD>
   <value1>M1</value1>
   <value2>M2</value2>
   <value3>M3</value3>
   <value4>M4</value4>
   <value5>M5</value5>
   <value6>M6</value6>
</ABCD>

<强>解释

  1. 递归命名模板,当传递的text-parameter成为空字符串时带有stop-condition。

  2. 正确使用 xsl:element AVT

  3. 正确使用标准XPath函数 substring-before() substring-after

  4. 正确使用 sentinel 来简化代码并提高效率。

答案 1 :(得分:0)

如果您有权访问EXSLT,则可以使用str:split()

<xsl:apply-templates select='str:split(/Data/value, ",")' />

Runnable example here