这是我的xml:
<root>
<node>
<element id='1'>
<subelement>val</subelement>
</element>
<element id='2'>
<subelement>val</subelement>
</element>
</node>
我不知道父名称和'node'名称
解决方案 descendant :: * [@ id ='1'] / subelement
答案 0 :(得分:1)
这符合主题中的条件:
//element/@id eq //element/subelement/text()
但你想用它做什么?也许你需要这个更通用?
答案 1 :(得分:1)
如果您知道它有多深,那么您可以使用*
,如下所示:
/*/*/element[@id = '1']/subelement
答案 2 :(得分:1)
我不知道父母的名字和 'node'名称
解决方案
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()
功能)使这成为一种非常有效的解决方案 - 具有次线性(甚至接近常量)的时间复杂度