2014-10-16 70 views
0

突然想到說我有以下XML:的Xpath:元素的「ABC」的數字,其parent`s父包含1「ABC」元素

<elementList id="1"> 
    <everything> 
     <owned>no</owned> 
    </everything> 
    <elementList id="2"> 
     <allElements> 
      <owned>no</owned> 
     </allElements> 
     <officeList id="3"> 
      <room> 
       <owned>no</owned> 
      </room> 
      <furniture> 
       <owned>yes</owned> 
      </furniture> 
     </officeList> 
    </elementList> 
    <transportation> 
     <allCarsOwned> 
      <owned>yes</owned> 
     </allCarsOwned> 
     <cars id="4"> 
      <truck> 
       <owned>yes</owned> 
      </truck> 
      <motorcycle> 
       <owned>yes</owned> 
      </motorcycle> 
      <familyCar> 
       <owned>yes</owned> 
      </familyCar> 
     </cars> 
    </transportation> 
</elementList> 

我想創造出一個計數的XSLT「所有的「元素,無論他們擁有什麼名稱,還有沒有擁有的元素,沒有統計包含其他元素的祖先列表(複合元素)(只計算包含子元素的終端元素)。例如,「擁有」元素是:

furniture, truck, motorcycle, familyCar 

同樣,「不屬於」內容是:

room 

下列元素不應該包括在任何列表:

everything, allElements, allCarsOwned 

名稱可能有很大的差異,沒有規則,我不能通過名字來識別它們。

目前我算所擁有,因此不擁有這樣的東西:

<xsl:variable name="ownedStuff" select="count(//doc:owned[text()='yes'])"/> 
    <xsl:variable name="notOwnedStuff" select="count(//doc:owned[text()='no'])"/> 

,但是這給了我假計數。

我寧願使用下面的表達式:

count(//doc:owned[text()='whatever'] and count(//doc:owned::parent::parent:://doc:owned) lt 2) 

或東西..我`噸真的得到它。

有人可以幫助我嗎?

. 
. 
. 

劇情變化:它會非常很難有ID和父節點名稱爲每個擁有/不屬於節點的整條生產線?

謝謝大家!

+0

注意:列表並不一定需要所有參數,有的缺少ID,有的還有其他參數......它非常搞砸 – ro0ter 2014-10-16 15:28:02

回答

0

如果我理解正確的這個,你要算誰的元素:

  1. 有一個孩子owned,其值=「是」;和
  2. 沒有比owned

一個 「侄子」 等 -

<xsl:value-of select="count(//*[owned='yes' and not(../*/*[not(self::owned)])])"/> 

恐怕我不明白這個部分:

情節變化:是否很難擁有全部ID爲 的行以及每個擁有/不是o的父節點名稱wned節點?

+0

如何格式化註釋?!?!?!?! 我想統計所有「終端元素」(不包含其他元素的元素)擁有或不擁有。 。 與「情節變化」 referrs不只是有這兩個列表中的一部分: 擁有:傢俱,卡車,摩托車,的FamilyCar 未所屬: 房間 但有每個元素爲: 擁有:elementList-> elementList-> furniture,elementList-> transportation-> cars-> truck,elementList-> transportation-> cars-> motorcycle,elementList-> transportation-> cars-> familyCar 不擁有:elementList-> elementList-> room – ro0ter 2014-10-17 06:13:10

+0

@ ro0ter「*你如何格式化評論?!?!?!*」你沒有;你可以編輯你的問題。 – 2014-10-17 07:52:26

0

我自己發現了兩種解決方案,這要歸功於Google和空閒時間!

首先,我要感謝@BallaR的回答另一個問題(在stackoverflow.com):

XPath to count the child nodes based on complex filter

他對這個問題的回答是:

count(//ComRequest/root/component[count(compLine)>10]) 

並讓我考慮使用複雜的選擇,它做了伎倆!感謝上帝,這樣的想法是可能的......自從我與XSLT合作已經有5年多了,我不敢相信我忘記了這麼快。

解決複雜的過濾器計算節點是:

count(//doc:owned[text()='whatever' and count(../..//doc:owned[text()='whatever']) lt 2]) 

現在我必須看到,如果我得到歷數各資元素的所有祖先的點。

. 
. 
. 

事實上,有可能還可以得到「任何」擁有節點的所有祖先(通常是「不」,在我的情況下所擁有)的名稱:

<xsl:for-each select="//doc:owned[text()='whatever' and count(../..//doc:owned[text()='whatever']) lt 2]"> 
    <xsl:value-of select="position()"/>. 
    <xsl:value-of select="name(..)"/> 
    <xsl:if test="../@Id"> 
     (#<xsl:value-of select="../@Id"/>) 
    </xsl:if> 
    <xsl:call-template name="while"> 
     <xsl:with-param name="parentNode" select="../.."/> 
    </xsl:call-template> 
</xsl:for-each> 

<xsl:template name="while"> 
    <xsl:param name="parentNode"/> 
    <xsl:if test="name($parentNode) != ''"> <!-- to avoid root and document nodes --> 
     [<xsl:value-of select="name($parentNode)"/> 
     <xsl:if test="$parentNode/../@Id"> 
      (#<xsl:value-of select="$parentNode/../@Id"/>) 
     </xsl:if>] 
     <xsl:if test="$parentNode/.."> 
      <xsl:call-template name="while"> 
       <xsl:with-param name="parentNode" select="$parentNode/.."/> 
      </xsl:call-template> 
     </xsl:if> 
    </xsl:if> 
</xsl:template> 

我很高興XSLT存在:)

問候大家!

相關問題