鉴于以下文件:
<foo>
<object>
<property name="value"> <!-- MATCH THIS NODE -->
<string>alpha</string>
</property>
<property name="name">
<string>$A$</string>
</property>
</object>
<object>
<property name="value">
<string>bravo</string>
</property>
<property name="name">
<string>$B$</string>
</property>
</object>
</foo>
和基于身份转换的样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- HAVING PROBLEMS HERE -->
<xsl:template match="property[@name='value'][../property[@name='name']/string='$A$']">
Replace with text!
</xsl:template>
</xsl:stylesheet>
当我需要关闭兄弟属性/字符串元素(字符串$ A $)的内容时,如果我想匹配原始文档上指示的节点,我会使用什么谓词?
答案 0 :(得分:1)
我不确定这是否足以满足您的需求,但这应该让您接近:
property[following-sibling::property[1]/string = '$A$']
这匹配属性节点,其中下一个兄弟属性具有子字符串,其中文本等于“$ A $”
如果你有两个属性节点的相同模板,这应该有效,但如果你的XML有更多属性节点,则需要调整。
答案 1 :(得分:1)
试试这个:
propery[@name='value' and ../property[@name='name' and string = '$A$']]
答案 2 :(得分:0)
为了完整起见,“自上而下”的XPath:
/foo/object[property[@name='name']='$A$']/property[@name='value']
虽然像以下这样的XML结构会更有意义:
<foo>
<object>
<property name="$A$">
<string>alpha</string>
</property>
</object>
<object>
<property name="$B$">
<string>bravo</string>
</property>
</object>
</foo>
因为你可以做到
/foo/object/property[@name='$A$']