2010-09-01 27 views
2

這些是我的xml:XPath的XSL發現當父母具有屬性等於值

<root> 
<node> 
<element id='1'> 
    <subelement>val</subelement> 
</element> 
<element id='2'> 
    <subelement>val</subelement> 
</element> 
</node> 

我不知道父母的名字和「節點」名

解決方案 後裔:: * [ @ ID = '1'] /子元件

+0

很不錯的解決方案。 – 2010-09-01 10:13:43

+0

好問題(+1)。查看我的答案以獲得高效的XSLT解決方案。 :) – 2010-09-01 12:55:59

回答

1

我不知道父母的名字和 「節點」名

解決方案descendant::*[ @id= '1' ]/subelement

使用descendant::*可能效率極低,因爲這會導致以當前節點爲根的完整子樹遍歷。

下面是一個有效的XSLT溶液

該轉化

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes"/> 
<xsl:key name="kElByParentId" match="*" use="../@id"/> 

<xsl:template match="/"> 
    <xsl:copy-of select="key('kElByParentId', '1')"/> 
</xsl:template> 
</xsl:stylesheet> 

當所提供的XML文檔施加(校正爲良好的形成):

<root> 
    <node> 
     <element id='1'> 
      <subelement>val</subelement> 
     </element> 
     <element id='2'> 
      <subelement>val</subelement> 
     </element> 
    </node> 
</root> 

產生想要的,正確的結果

<subelement>val</subelement> 

請注意:使用外鍵(<xsl:key>key()功能),這使得一個非常有效的解決方案 - 用次線性(甚至接近恆定)的時間複雜度。

+0

+1好答案。 – 2010-09-01 13:20:14

1

這將在受試者符合條件:

//element/@id eq //element/subelement/text() 

但是你想怎麼做呢?也許你需要這個更通用?

+0

我不知道'元素'的名字 – 2010-09-01 09:51:16

1

如果你知道它有多深,那麼你可以只使用*爲:

/*/*/element[@id = '1']/subelement