Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 如何编写谓词以匹配美元符号字符?_Xslt - Fatal编程技术网

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