如何使用XSLT找到<xs:list>中的元素数?</xs:list>

时间:2011-10-11 11:50:32

标签: xslt xpath xsd xslt-2.0 xpath-2.0

我有一个包含以下类型的XML架构:

<xs:simpleType name="valuelist">
  <xs:list itemType="xs:double"/>
</xs:simpleType>

示例XML片段将是:

<values>1 2 3.2 5.6</values>

在XSLT转换中,如何获取列表中的元素数量?

如何迭代元素?

4 个答案:

答案 0 :(得分:1)

如果列表是严格间隔的,则可以根据字符串长度计算空格。

<values>1 2 3.2 5.6</values>

XSLT:

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

    <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

    <xsl:template match="/">
        <xsl:value-of select="string-length(values) 
                      - string-length(translate(values, ' ', '')) + 1"/>
    </xsl:template>

</xsl:stylesheet>

要迭代元素,您必须拆分此字符串。 SO上有很多例子。

答案 1 :(得分:1)

<强>予。 XPath 2.0(XSLT 2.0)解决方案:

count(tokenize(., ' '))

<强> II。 XPath 1.0(XSLT 1.0)解决方案:

 string-length()
-
 string-length(translate(normalize-space(), ' ', ''))
+ 1

关于此列表项目的迭代:

  1. 在XPath 2.0 / XSLT 2.0中,只需使用上面的XPath 2.0表达式作为select属性的值:
  2. -

     for $i in tokenize(., ' '),
         $n in number($i)
      return
        yourXPathExpression
    

    -

    2.在XSLT 1.0中,您需要更多代码来进行拆分/标记化。这个问题有几个很好的答案(我的一部分) - 只是搜索“xslt split a string”这样的东西

答案 2 :(得分:1)

在架构感知转换中,使用count(data(value))

答案 3 :(得分:0)

只需一点想象力,您就可以编写自己的分割功能:

<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
    <xsl:output method='text'/>

    <xsl:template name="split-list">
    <xsl:param name="list" />
    <xsl:param name="separator"/>
    <xsl:variable name="newlist" select="concat(normalize-space($list), $separator)" /> 
    <xsl:variable name="first" select="substring-before($newlist, $separator)" /> 
    <xsl:variable name="remaining" select="substring-after($newlist, $separator)" />
            <xsl:message terminate="no">
            <xsl:value-of select="$first" />
        </xsl:message>

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

<xsl:template match="/">
    <xsl:variable name="myList">
            1 2 3.2 5.6
    </xsl:variable>
        <xsl:call-template name="split-list">
            <xsl:with-param name="list" select="$myList" />
            <xsl:with-param name="separator">
                <xsl:text> </xsl:text>
            </xsl:with-param>
        </xsl:call-template>
</xsl:template>
</xsl:stylesheet>

输出:

[xslt] Loading stylesheet D:\Tools\StackOverFlow\test.xslt
[xslt] 1
[xslt] 2
[xslt] 3.2
[xslt] 5.6