这些是我的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