如何编写谓词以匹配美元符号字符?

时间:2010-01-29 20:36:01

标签: xslt

鉴于以下文件:

<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 $)的内容时,如果我想匹配原始文档上指示的节点,我会使用什么谓词?

3 个答案:

答案 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$']