2011-01-10 25 views
2

比方說,我有一個XML文件是這樣的:計數多少次的東西出現在XML文檔的另一部分

<root> 
<a><b><c> w </c></b></a> 
<x><y><z> w </z></y></x> 
<x><y><z> w </z></y></x> 

和XSL一行:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/root"> 
    <xsl:value-of select="count(./a/b[c = ./x/y/z])"/> 
    </xsl:template> 
</xsl:stylesheet> 

結果是0(我希望它是2 :)

這只是我想要做的一個簡單的例子。基本上我想要計算從'a/b/c'出現在文檔的某個其他部分的內容的次數,正如你所看到的,我做錯了一些事情。

+0

好問題,+ 1.請參閱我的答案,瞭解使用XSLT的全部功能的簡單而簡短的解決方案。:) – 2011-01-10 19:14:21

回答

1

我熟悉XSLT 1.0;但我在這裏看到的兩件事情已關閉:

  • 您正在計算符合某些標準的「c」但只有一個c - 你想要計算「z」s。
  • 你在b背景下評估./x/y/z/,而不是在的背景下 - 這樣XPath是不是做你的期望。

在XSLT 1.0(也可能不無事生非2.0,則):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/root"> 
    <xsl:variable name="self" select="."/> 
    <xsl:value-of select="count(x/y/z[. = $self/a/b/c])"/> 
    </xsl:template> 
</xsl:stylesheet> 

在你真正的代碼,它很可能是不清晰的定義一個變量指向/root,但存儲您直接尋找的字符串:<xsl:variable name="val" select="a/b/c"/>;任何方式都可以工作。

2

使用

​​

這意味着

選擇所有/*/x/y/z元件,其字符串值等於(之一)的current()/a/b/c元素的字符串值。

注意,標準XSLT函數current()計算結果爲當前節點(所述一個的量,模板已被選擇,或在其上施加一個<xsl:for-each>的主體中的一個。

+2

+1。比顯式變量聲明更好。 – Flack 2011-01-10 22:50:26