Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何查找a<;中的元素数;xs:list>;使用XSLT?_Xslt_Xpath_Xsd_Xslt 2.0_Xpath 2.0 - Fatal编程技术网

如何查找a<;中的元素数;xs:list>;使用XSLT?

如何查找a<;中的元素数;xs:list>;使用XSLT?,xslt,xpath,xsd,xslt-2.0,xpath-2.0,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> 123.25.6 在XSLT转换中,如何获取列表中的元素数 如何迭代元素?如果列表是严格间隔的,则可以根据字符串长度计算空格 <valu

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

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

示例XML片段如下所示:

<values>1 2 3.2 5.6</values>
123.25.6
在XSLT转换中,如何获取列表中的元素数


如何迭代元素?

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

<values>1 2 3.2 5.6</values>
123.25.6
XSLT:



要迭代元素,必须拆分此字符串。这里有很多示例。

只要有一点想象力,您就可以编写自己的拆分函数:

<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>
I.XPath2.0(XSLT2.0)解决方案

count(tokenize(., ' '))
 string-length()
-
 string-length(translate(normalize-space(), ' ', ''))
+ 1
II。XPath 1.0(XSLT 1.0)解决方案

count(tokenize(., ' '))
 string-length()
-
 string-length(translate(normalize-space(), ' ', ''))
+ 1
对于该列表项的迭代:

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

    --


    2.
    在XSLT1.0中,您需要有更多用于拆分/标记化的代码。这个问题有几个很好的答案(其中一部分是我的)——只要在模式感知转换中搜索类似“xslt拆分字符串”之类的内容,使用
    count(data(value))

    元素就是您所引用的元素,但是xslt处理器会将其解释为文本。@\u Kirill:回答不错,但是,如果分隔符是任何一组空格——正如XML模式列表类型的定义所示,该怎么办@_基里尔:最好改进解决方案本身:)
     for $i in tokenize(., ' '),
         $n in number($i)
      return
        yourXPathExpression