如何选择任何级别的节点的父节点及其属性

时间:2016-05-30 09:20:58

标签: xml xslt xpath

我执行XSLT转换,我在模板中使用XPATH从XML获取信息,此时没什么特别的,但是:

当我浏览“ firstEngine ”元素并浏览“引擎时,我尝试获取节点” Aircraft “的ID “元素(而不是”引擎“元素)。 我搜索XPATH表达式以获得第一个父元素的“ id ”,其中“ xsi:type ”的值为“ Jet ”无论他父母的水平如何。

我用这个表达式尝试没有成功:

../Aircraft[xsi:type="Jet"]/@id



<Aircraft xsi:type="Jet" id="4">
    <MTOW>0</MTOW>
    <firstEngine>
        <nbFans>2</nbFans>
        <name>turbofanengine</name>
    </firstEngine>
    <engines>
        <Engine>
            <nbFans>2</nbFans>
            <name>turbofanengine</name>
        </Engine>
    </engines>
    <name>jet</name>
</Aircraft>
编辑:#michael.hor257k您的表达非常好,我使用Editix来测试xpath实验,它似乎有问题,我不得不重新启动editix以使其工作。 谢谢你!

2 个答案:

答案 0 :(得分:1)

猜测你想要使用:

ancestor::Aircraft/@id

这可以从Aircaft任何后代的上下文中起作用。

我遗漏了[@xsi:type="Jet"]谓词,因为似乎一个节点不太可能有一个Aircaft个祖先。但这只是我的一个推测。

答案 1 :(得分:0)

您想要选择一个属性,因此../Aircraft[xsi:type="Jet"]/@id应为../Aircraft[@xsi:type="Jet"]/@id。这应该与<xsl:template match="firstEngine"><xsl:value-of select="../Aircraft[@xsi:type="Jet"]/@id"/></xsl:template>一起使用。对于其他元素,您需要../../Aircraft[@xsi:type="Jet"]/@id1