2010-01-29 58 views
2

鉴于以下文件:如何编写谓词来匹配美元符号字符?

<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 $)的内容?

回答

1

试试这个:

propery[@name='value' and ../property[@name='name' and string = '$A$']] 
+0

完美!谢谢。 – 2010-01-29 20:58:21

1

我不知道如果这是您需要足够的通用性,但这应该让你接近:

property[following-sibling::property[1]/string = '$A$'] 

这其中,其中一个兄弟财产有孩子财产节点匹配字符串其中文本等于“$ A $”

如果您具有两个属性节点的相同模板,但如果您的XML具有更多属性节点,则需要进行调整。

+0

这适用于我的实际文档,但还有其他元素,并且有些情况下@ name = name和@ name = value节点的顺序相反。 – 2010-01-29 20:57:41

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$'] 
+0

不幸的是,我不能这样做,因为文档实际上是一个持久化的Java对象(不确定实际上正在使用什么样的持久性框架)并且所讨论的节点可能在文档中移动(对象元素具有id或refid属性来将对同一对象的引用链接在一起)。我也无法重构文档,因为我不控制实际使用此文档构建安装程序的工具集的格式。 – 2010-02-03 22:20:18