xml - 根据内容选择子节点

标签 xml xslt xpath nodes

XML 片段:

<AA>
  <BB>foo</BB>
  <CC>bar</CC>
  <DD>baz</DD>
  <EE>bar</EE>
</AA>

如何选择 <AA> 的所有子节点?有 bar作为其内容?在上面的示例中,我想选择 <CC><EE> .我认为解决方案是这样的:

<xsl:template match="AA">
  <xsl:for-each select="???" />
</xsl:template>

最佳答案

OP 问题的最简单解决方案之一是以下 XPath 表达式:

*/*[.='bar']

请注意,不涉及任何 XSLT 指令——这只是一个 XPath 表达式,因此该问题只能标记为 XPath。

从这里开始,您可以通过多种方式在 XSLT 中使用此 XPath 表达式,例如在所有选定节点上应用模板

例如,下面是一个 XSLT 转换,它采用 XML 文档并生成另一个文档,其中所有元素 - <AA> 的子元素其内容不等于"bar"被删除:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="AA">
      <xsl:copy>
         <xsl:apply-templates select="*[. = 'bar']"/>
      </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

当此转换应用于原始 XML 文档时:

<AA>
    <BB>foo</BB>
    <CC>bar</CC>
    <DD>baz</DD>
    <EE>bar</EE>
</AA>

产生了想要的结果:

<AA>
   <CC>bar</CC>
   <EE>bar</EE>
</AA>

请注意:

在匹配模式中,我们通常不需要指定绝对 XPath 表达式,而只需指定相对表达式,因此完整的 XPath 表达式自然会简化为此匹配模式:

*[. = 'bar']

关于xml - 根据内容选择子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/718531/

相关文章:

xml - 更改元素名称的样式表

xml - 计算某个内容在 xml 文档的其他部分出现的次数

xslt - 需要在 Tomcat 标准输出日志文件中抑制 "Warning: running an XSLT 1.0 stylesheet with an XSLT 2.0 processor"

xml - 使用 XSLT 1.0 在 XML 中添加多个命名空间

java - XPath 表达式不起作用

php - 检查 XML 属性值

ruby - 如何使用 Ruby 和 Nokogiri 解析 USPTO XML 文件?

java - 自动测试以检查 XML 输出

python-3.x - 如何从以下html中提取数据?

XML 格式未知时的 Java XPath 命名空间