使用XSLT根据兄弟节点条件选择节点

时间:2010-06-24 16:21:14

标签: xpath

假设我有这样的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(没有任何扩展名),我想只选择metadata_key为“include”的那些值。所以,对于这个例子,我想选择value1和value3。

我该怎么做?

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

对于metadata_value节点集,请使用

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

添加@value以获取值本身。

答案 2 :(得分:0)

我想你想要

//atributes[metadata_key/@value='include']/metadata_vale/@value

或(如Lucero发布的)

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

但是,根据您想要做的事情,您应该使用密钥,因为这是交叉引用(metadata_key/@value用作metadata_value/@value的关键字)。避免后代轴也很好。

答案 3 :(得分:0)

使用

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

使用//缩写通常效率很低,因为这会导致遍历整个(子)树。