Xslt 如何编写谓词以匹配美元符号字符?
鉴于以下文件:Xslt 如何编写谓词以匹配美元符号字符?,xslt,Xslt,鉴于以下文件: <foo> <object> <property name="value"> <!-- MATCH THIS NODE --> <string>alpha</string> </property> <property name="name"> <string>$A$</string> </p
<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>
阿尔法
一美元$
好极了
B美元$
以及基于标识转换的样式表:
<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$)的内容时,如果我想匹配原始文档上指示的节点,我将使用哪些谓词?我不确定这是否足够通用,以满足您的需要,但这应该可以让您接近:
property[following-sibling::property[1]/string = '$A$']
这与属性节点匹配,其中下一个同级属性有一个子字符串,其中文本等于“$a$”
如果您的同一模板有两个属性节点,则此操作应该有效,但如果您的XML有更多属性节点,则需要进行调整。尝试以下操作:
propery[@name='value' and ../property[@name='name' and string = '$A$']]
为完整起见,“自顶向下”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$']
/foo/object/property[@name='$A$']
这适用于我的实际文档,但是还有其他元素,@name=name和@name=value节点的顺序是相反的。不幸的是,我不能这样做,因为文档实际上是一个持久化Java对象(不确定实际使用的是哪种持久化框架)并且所讨论的节点可能在文档中四处移动(对象元素具有id或refid属性,用于将对同一对象的引用链接在一起)。我也不能重新构造文档,因为我不控制实际使用此文档构建安装程序的工具集的格式。 /foo/object/property[@name='$A$']