XSLT 2.0:将字符串拆分为逗号分隔值

时间:2012-01-06 10:27:29

标签: string xslt comma

我是XSLT的新手,并且要求我必须在下面操作字符串。

输入字符串=“12345”

预期输出=“12345,1234,123,12”

任何人都可以帮助我在XSLT 2.0中实现这一目标

4 个答案:

答案 0 :(得分:1)

这应该可以解决问题:

<xsl:template match="/">
  <xsl:call-template name="minus-one">
    <xsl:with-param name="input" select="'12345'"/>
  </xsl:call-template>
</xsl:template>

<xsl:template name="minus-one">
  <xsl:param name="input"/>

  <xsl:value-of select="$input"/>

  <xsl:if test="string-length($input) gt 2"><xsl:text>,</xsl:text>
    <xsl:call-template name="minus-one">
      <xsl:with-param name="input" select="substring($input, 1, string-length($input) - 1)"/>
    </xsl:call-template>
  </xsl:if>
</xsl:template>

答案 1 :(得分:1)

这是一些XSLT / XPath 2.0方法:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:mf="http://example.com/mf"
  exclude-result-prefixes="xs mf"
  version="2.0">

  <xsl:function name="mf:sub-sequences" as="xs:string*">
    <xsl:param name="input" as="xs:string"/>
    <xsl:param name="min-length" as="xs:integer"/>
    <xsl:sequence select="reverse(
                            for $length in $min-length to string-length($input)
                            return substring($input, 1, $length)
                          )"/>
  </xsl:function>

  <xsl:template name="main">
    <xsl:variable name="s" select="'12345'"/>
    <xsl:value-of select="mf:sub-sequences($s, 2)" separator=","/>
  </xsl:template>

</xsl:stylesheet>

答案 2 :(得分:1)

这是一个比目前接受的解决方案更有效的解决方案 reverse() 功能

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:my="my:my">
    <xsl:output method="text"/>

 <xsl:function name="my:subSequences" as="xs:string*">
   <xsl:param name="pString" as="xs:string"/>
   <xsl:param name="pstartLength" as="xs:integer"/>
   <xsl:sequence select=
     "for $totalLength in string-length($pString),
          $length in 1 to $totalLength -$pstartLength +1,
          $revLength in $totalLength -$length +1
               return
                  substring($pString, 1, $revLength)"/>
 </xsl:function>

 <xsl:template match="/">
  <xsl:value-of select="my:subSequences('12345', 2)" separator=","/>
 </xsl:template>
</xsl:stylesheet>

执行此转换时,会生成所需的正确结果

12345,1234,123,12

解释

XPath 2.0 W3C Spec定义如果to运算符的第一个参数大于第二个参数,则结果序列为空序列。

仍然可以避免这种限制并构造一个递减的整数序列,如下所示:

 for $k in 0  to $big - $small
  return  
     $big - $k

使用这样的表达式比使用reverse()函数首先构建递增序列然后反转它更有效,特别是对于大序列。

答案 3 :(得分:0)

<string>12345</string>

以下xslt将生成结果12345,1234,123,12

<?xml version="1.0" encoding="utf-8"?>
<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:template match="string">
        <xsl:call-template name="doTheFunkeyMonkey">
            <xsl:with-param name="data" select="."/>
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="doTheFunkeyMonkey">
        <xsl:param name="data"/>
        <xsl:value-of select="$data"/>
        <xsl:if test="string-length($data) &gt; 2">
            <xsl:text>,</xsl:text>
            <xsl:call-template name="doTheFunkeyMonkey">
                <xsl:with-param name="data" select="substring($data,1,string-length($data)-1)"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>