2011-10-11 704 views
3

我有一個包含以下類型的XML架構:如何使用XSLT查找<xs:list>中的元素數量?

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

示例XML片段是:

<values>1 2 3.2 5.6</values> 

在XSLT轉換,我如何才能在列表中元素的個數?

如何迭代元素?

+0

一個元素是然而,您所指的元素將被xslt處理器解釋爲文本。 – FailedDev

回答

1

一的XPath 2.0(XSLT 2.0)解決方案

count(tokenize(., ' ')) 

二,的XPath 1.0(XSLT 1.0)溶液

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

至於迭代移到該列表的項目:

  1. 在XPath 2.0/XSLT 2.0只是使用以上的XPath 2.0表達式作爲a的值select屬性:

-

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

-

2.在XSLT 1.0中,您需要更多的代碼來分割/標記。這個問題有幾個很好的答案(其中一部分是我的) - 只需要搜索「xslt split a string」

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有很多例子。

+0

@_Kirill:很好的答案,但是如果分隔符是任意一組空格 - 它是按照XML架構列表類型定義的呢? :) –

+0

@DimitreNovatchev,這就是爲什麼我說「嚴格間隔」... –

+0

@_Kirill:這將是更好的改善解決方案本身:) –

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 
1

在架構感知轉換中,使用count(data(value))