2017-03-09 31 views
0
<a> 
    <z/> 
    <b/> 
    <b/> 
    <b/> 
    <c/> 
</a> 

我想找到在「B」的數「A」當我解析當前節點是「C」使用XSLT。
使用XSLT可以做到這一點嗎?
我不知道元素名稱'b'是什麼,即它的前一個兄弟。我想找到它的父元素中的當前元素的計數使用XSLT

+0

你的問題不明確。你的標題說你想要「*其父元素中當前元素的數量*」。如果你在'c'的上下文中,那麼這意味着所有名爲'c'的兄弟姐妹的計數。但是你說你想要數'b' - 但是你不知道'b'的名字。那麼你如何提出識別'b'? –

回答

3

如果定位在c標籤,或任何元素實際上是調用,然後就搞定了,你會做這個前面的兄弟姐妹的個性化......

<xsl:value-of select="count(preceding-sibling::*)" /> 

編輯:在回答你的發表評論,如果您不想指望所有的兄弟姐妹,但只有緊接一個的計數,並與之前的相同名稱的那些,你可以試試這個...

<xsl:value-of select="count(preceding-sibling::*[name() = name(current()/preceding-sibling::*[1])])" /> 

這不會盡管在你有多個c節點的情況下工作明鏡一個父...

<a> 
    <z/> 
    <b/> 
    <b/> 
    <b/> 
    <c/> 
    <z/> 
    <b/> 
    <c/> 
</a> 

在這種情況下,可以通過第一下列元素的唯一ID用不同的名稱來定義這樣一個鍵,組元素:

<xsl:key name="keyc" match="*" use="generate-id(following-sibling::*[name() != name(current())][1])" /> 

然後你可以得到數,像這樣:

<xsl:value-of select="count(key('keyc', generate-id()))" /> 

以下是在行動中的三個選項....

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="keyc" match="*" use="generate-id(following-sibling::*[name() != name(current())][1])" /> 

    <xsl:template match="c"> 
     <c> 
     <example1> 
      <xsl:value-of select="count(preceding-sibling::*)" /> 
      </example1> 
     <example2> 
      <xsl:value-of select="count(preceding-sibling::*[name() = name(current()/preceding-sibling::*[1])])" /> 
      </example2> 
      <example3> 
      <xsl:value-of select="count(key('keyc', generate-id()))" /> 
      </example3> 
     </c> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

它得到的所有計數我只想'b' – divya

+0

在你的問題中,你說你'沒有意識到元素名'b',所以如果你不知道它是什麼,那麼你不能真正地計算一些東西。你真的說你想要得到'c'的前一個兄弟姐妹,並計算它的出現次數嗎? –

+0

我已經修改了我的答案,顯示了許多您可以嘗試的不同選項。 –

1

使用xsl:number。它打印出當前元素的數字,按要求格式化。

關於如何進行計算有多種選擇,例如 多層次或字母的。

其實它是一個相當強大的工具。

0

我想找到在「B」的數「A」當我解析當前節點是「C」

讓我換一種說法:
你要計算的<b>所有出現與<c>處於同一水平。要被計數
的元素的local-name(在這種情況下「B」)::

這XSLT通過調用<xsl:template>用參數做這項工作

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="//c">       <!-- select the desired target element --> 
    <xsl:call-template name="count"> 
    <xsl:with-param name="elemName" select="'b'" /> <!-- name of the element --> 
    </xsl:call-template> 
</xsl:template> 

    <xsl:template name="count">       <!-- count all matching elements before and after --> 
    <xsl:param name="elemName" /> 
    <xsl:value-of select="count(preceding-sibling::*[local-name() = $elemName]) + count(following-sibling::*[local-name() = $elemName])" /> 
</xsl:template> 

</xsl:stylesheet> 

在您的例子的情況下輸出簡單地說就是:

相關問題