当父类具有等于value的属性时,xpath xsl查找

时间:2010-09-01 09:41:34

标签: xml xslt

这是我的xml:

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

我不知道父名称和'node'名称

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

3 个答案:

答案 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()功能)使这成为一种非常有效的解决方案 - 具有次线性(甚至接近常量)的时间复杂度