Xpath 使用XSLT根据同级节点条件选择节点

Xpath 使用XSLT根据同级节点条件选择节点,xpath,Xpath,假设我有如下XML: <child_metadata> <metadata> <attributes> <metadata_key value="include"/> <metadata_value value="value1"/> </attributes> </metadata> <m

假设我有如下XML:

<child_metadata>
    <metadata>
        <attributes>
                <metadata_key value="include"/>
                <metadata_value value="value1"/>
        </attributes>
    </metadata>
    <metadata>
        <attributes>
                <metadata_key value="dont_include"/>
                <metadata_value value="value2"/>
        </attributes>
    </metadata>
    <metadata>
        <attributes>
                <metadata_key value="include"/>
                <metadata_value value="value3"/>
        </attributes>
    </metadata>
</child_metadata>

使用XSLT(没有任何扩展),我只想选择元数据_键为“include”的那些值。因此,对于这个例子,我想选择value1和value3


如何做到这一点?

要使用的XPath表达式(对于模板或在for each循环中)是:

//metadata_value[../metadata_key/@value='include']/@value

因为不清楚“选择”是什么意思,所以我无法发布完整的XSLT示例。XSLT用于转换,而不是查询(“选择”数据);查询是使用XPath表达式完成的,比如我上面提供的表达式。

对于
元数据\u值
节点集,请使用

//metadata/attributes[metadata_key/@value='include']/metadata_value
添加
@value
以获取值本身。

我想您需要

//atributes[metadata_key/@value='include']/metadata_vale/@value
或(如卢塞罗邮报)

但是,根据您要执行的操作,您应该使用键,因为这里有一个交叉引用(
metadata\u key/@value
用作
metadata\u value/@value
)的键)。避免子代轴也很好。

使用:

/child_metadata/metadata/attributes[metadata_key/@value='include']/metadata_value/@value
使用
/
缩写通常效率低下,因为这会导致遍历整个(子)树

/child_metadata/metadata/attributes[metadata_key/@value='include']/metadata_value/@value