假设我有这样的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。
我该怎么做?
答案 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
使用//
缩写通常效率很低,因为这会导致遍历整个(子)树。