2013-02-13 57 views
-2

我試圖找出一種方法,確保感興趣的元素不會(遞歸地)包含「相同」元素。例如: -XSLT - XPath,某些類型的最深元素

<Ev> 
    <Ev attr="0"> 
     <Ev someOtherAttr="str1"> 
     <Ev attr="1"> 
      <Ev> 
      </Ev> 
     </Ev> 
     </Ev> 
    </Ev> 
</Ev> 

在這裏,我想確保我擁有的元素是最深的一個與屬性命名ATTR(屬性值可以是任意的,不應該被匹配,也不考慮)。

因此,在這種情況下,我想選擇<Ev attr="1">出兩個 「張玉峯」 元素:

<Ev attr="0"><Ev atttr="1">

我一直想做什麼:

<xsl:for-each select="//Ev/@attr"> 
    <xsl:if select="//*[not(child::Ev/@attr)]"> 
     <xsl:value-of select="count(ancestor::node())"/> 
    </xsl:if> 
</xsl:for-each> 

如果部分當然不好,也許一個for-each select="<condition_a> and not(<condition_b>)"將是走?

(編輯什麼我已經試過的問題)

問候 手槍先生,

+1

你有沒有在你的最終嘗試新鮮事物@皮特?如果是,那麼你需要發佈你已經嘗試過。如果沒有,那麼你應該嘗試一下自己併發布!因爲「這裏是要求,給我代碼」類型的問題不被鼓勵,通常被視爲作業的東西,並得到許多downvotes和關閉的投票.. – 2013-02-13 10:06:59

+0

請告訴我們你到目前爲止的XSLT,以及這將適合於。 – JLRishe 2013-02-13 10:21:56

+0

對不起,不知道。但我會在未來:-)。現在我添加了我的想法。 – PistolPete 2013-02-13 11:08:23

回答

2

以下XPath表達式應該工作,雖然這不是很有效:

//Ev[@attr and not(.//Ev[@attr])] 
+0

我會盡快嘗試(會議)。 – PistolPete 2013-02-13 11:11:46

+0

謝謝,它完美地滿足了我的需求! – PistolPete 2013-02-13 15:45:11

1

會是這樣的滿足您的需求?

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

    <xsl:template match="/"> 
    <xsl:apply-templates select="//Ev[@attr]" mode="deepest"> 
     <xsl:sort select="count(ancestor::*)" data-type="number" order="descending" /> 
    </xsl:apply-templates> 
    </xsl:template> 

    <xsl:template match="Ev" mode="deepest"> 
    <xsl:if test="position() = 1"> 
     <!-- If we get to the inside of this xsl:if, the context node is 
      the deepest Ev in the selection --> 
     <xsl:value-of select="count(ancestor::node())"/>   
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

當示例XML運行,這將產生:

4 
+0

不!實際上,他希望它被推廣..說如果有更多的名稱爲「Ev」的元素具有'@ someOtherAttr',出現在具有'@ someOtherAttr'的'Ev'下,那麼應該忽略孩子..或者如果它有一個應該保留更多屬性'@ attr'! – 2013-02-13 10:20:01

+0

這就是我所理解的,當他說'相同'的元素。 – 2013-02-13 10:20:19

+0

感謝您的努力,但我去的nwellnhofs解決方案。 – PistolPete 2013-02-13 15:49:25