逗号分隔的字符串解析XSLT

时间:2010-05-17 14:58:06

标签: xslt

如何循环我在XSLT 1.0中作为参数传递的逗号分隔字符串? 前 -

<xsl:param name="UID">1,4,7,9</xsl:param>

我需要循环上面的UID参数并从我的XML文件中的每个UID中收集节点

2 个答案:

答案 0 :(得分:20)

Vanilla XSLT 1.0可以通过递归来解决这个问题。

<xsl:template name="split">
  <xsl:param name="list"      select="''" />
  <xsl:param name="separator" select="','" />

  <xsl:if test="not($list = '' or $separator = '')">
    <xsl:variable name="head" select="substring-before(concat($list, $separator), $separator)" />
    <xsl:variable name="tail" select="substring-after($list, $separator)" />

    <!-- insert payload function here -->

    <xsl:call-template name="split">
      <xsl:with-param name="list"      select="$tail" />
      <xsl:with-param name="separator" select="$separator" />
    </xsl:call-template>
  </xsl:if>
</xsl:template>

有预先构建的扩展库可以进行字符串标记化(例如,EXSLT有一个模板),但我怀疑这是非常必要的。

答案 1 :(得分:4)

以下是使用FXSLstr-split-to-words模板的XSLT 1.0解决方案。

请注意,此模板允许拆分多个分隔符(作为单独的参数字符串传递),因此即使1,4 7;9也会在使用此解决方案时没有任何问题进行拆分。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common"
>

   <xsl:import href="strSplit-to-Words.xsl"/>

   <xsl:output indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="/">
      <xsl:call-template name="str-split-to-words">
        <xsl:with-param name="pStr" select="/"/>
        <xsl:with-param name="pDelimiters"
                        select="', ;&#9;&#10;&#13;'"/>
      </xsl:call-template>
    </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档

<x>1,4,7,9</x>

产生了想要的正确结果

<word>1</word>
<word>4</word>
<word>7</word>
<word>9</word>