2010-09-01 28 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