這些是我的xml:XPath的XSL發現當父母具有屬性等於值
<root>
<node>
<element id='1'>
<subelement>val</subelement>
</element>
<element id='2'>
<subelement>val</subelement>
</element>
</node>
我不知道父母的名字和「節點」名
解決方案 後裔:: * [ @ ID = '1'] /子元件
這些是我的xml:XPath的XSL發現當父母具有屬性等於值
<root>
<node>
<element id='1'>
<subelement>val</subelement>
</element>
<element id='2'>
<subelement>val</subelement>
</element>
</node>
我不知道父母的名字和「節點」名
解決方案 後裔:: * [ @ ID = '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()
功能),這使得一個非常有效的解決方案 - 用次線性(甚至接近恆定)的時間複雜度。
+1好答案。 – 2010-09-01 13:20:14
這將在受試者符合條件:
//element/@id eq //element/subelement/text()
但是你想怎麼做呢?也許你需要這個更通用?
我不知道'元素'的名字 – 2010-09-01 09:51:16
如果你知道它有多深,那麼你可以只使用*
爲:
/*/*/element[@id = '1']/subelement
很不錯的解決方案。 – 2010-09-01 10:13:43
好問題(+1)。查看我的答案以獲得高效的XSLT解決方案。 :) – 2010-09-01 12:55:59