2012-01-13 55 views
2

再次介绍节点集中的不同节点(基于属性值)。 想象u有以下结构:跨XSLT节点集的不同值

<struct> 
    <a> 
    <x id="1">a_1</x> 
    <x id="2">a_2</x> 
    <x id="3">a_3</x> 
    </a> 
    <b inherits="a"> 
    <x id="2">b_2</x> 
    </b> 
</struct> 

<struct/>可以包含多个元素,比如<b/>其继承相同<a/>。同时允许多个元素,如<a/>。订单<a/> s和<b/> s是任意的。继承是单层次的。

问题:如何创建一个的XPath,用于选择一个给定的<b/>以下节点集:

<x id="1">a_1</x> 
<x id="2">b_2</x> 
<x id="3">a_3</x> 

请注意在第二行的b_2值。

对此的任何解决方案?

更新:

的resuting的XPath应具有以下形式:b[(magic_xpath)[@id=2]='b_2'],其中magic_xpath<a/> S和<b/> S选用不同<x/>秒。

现实生活<struct/>可以是这样的:

<struct> 
    <a> 
    <x id="1">a_1</x> 
    <x id="2">a_2</x> 
    <x id="3">a_3</x> 
    </a> 
    <b inherits="a"> 
    <x id="2">I don't match resulting XPath</x> 
    </b> 
    <b inherits="a"> 
    <x id="2">b_2</x> 
    </b> 
</struct> 
+0

更新的含义是不明确的。当更新中的所有'x'元素都有不同的值时,结果是什么以及为什么需要“不同的'?请更新更新以使其清晰明确 – 2012-01-14 04:17:03

回答

1

使用

$vB/x 
| 
    /*/*[name() = $vB/@inherits] 
       /x[not(@id = $vB/x/@id)] 

其中$vB被定义为b元素。

这将选择所有b/x元素的联合和所有x儿童(与id属性,该属性是不等于任何b/x/@id属性)struct/*元件(的struct儿童),其名称是的b/@inherits值。

或者,如评论请求由OP - 不变量:

/*/b/x 
| 
    /*/*[name() = /*/b/@inherits] 
       /x[not(@id = /*/b/x/@id)] 

完整的基于XSLT的验证

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "/*/b/x 
    | 
     /*/*[name() = /*/b/@inherits] 
        /x[not(@id = /*/b/x/@id)] 

    "/> 
</xsl:template> 
</xsl:stylesheet> 

当这种转变是所提供的应用(纠正为格式良好)XML文档

<struct> 
    <a> 
     <x id="1">a_1</x> 
     <x id="2">a_2</x> 
     <x id="3">a_3</x> 
    </a> 
    <b inherits="a"> 
     <x id="2">b_2</x> 
    </b> 
</struct> 

单XPath表达式求值和所选择的节点输出

<x id="1">a_1</x> 
<x id="3">a_3</x> 
<x id="2">b_2</x> 
+0

谢谢你这么快速的回答!但是,是否有可能做同样的事情_without_声明变量? – 2012-01-13 14:27:06

+0

是的,只需用'/ */b'替换'$ vB' – 2012-01-13 14:29:02

+0

@Savva Mikhalevski:我编辑了一个XPath表达式的答案,该表达式没有引用变量 – 2012-01-13 14:31:50