1

例如,我有一个这样的 XML 示例

<a>
    <a1>A1</a1>
        <a11>A11</a11>
    <a2>A2</a2>
    Text <strong>text</strong> text...
<a>

如何使用 XPath 选择a仅包含的节点

<a>
    <a2>A2</a2>
    Text <strong>text</strong> text...
<a>
4

3 回答 3

1

不确定这对您来说是否足够灵活,但它应该可以帮助您入门

/a/a1 | a/text() | /a/*[not(starts-with(name(), 'a'))]

您可以在这里轻松地使用它:http ://www.xpathtester.com/test

于 2012-05-03T15:28:32.867 回答
1

XPath 是一种用于 XML 文档的查询语言。这意味着 XPath 表达式只能选择一组节点和/或提取数据。

请记住:XPath 表达式永远不会导致 XML 文档结构的修改(例如删除节点)。

答案是没有 XPath 表达式会选择您想要的节点,因为 XML 文档中没有这样的节点。

使用 XSLT 和(不那么容易)使用 XQuery 可以轻松实现您想要的:

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

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

 <xsl:template match="*[starts-with(name(), 'a1')]"/>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<a>
    <a1>A1</a1>
    <a11>A11</a11>
    <a2>A2</a2>     Text 
    <strong>text</strong> text... 
</a>

产生了想要的正确结果:

<a>
   <a2>A2</a2>     Text 
    <strong>text</strong> text... 
</a>
于 2012-05-03T15:57:54.970 回答
0

这个xpath:

//a[normalize-space(.)='A2 Text text text...']

只会选择:

<a>
    <a2>A2</a2>
    Text <strong>text</strong> text...
</a>

XSLT 示例...

XML 输入

<doc>
  <a>
    <a1>A1</a1>
    <a11>A11</a11>
    <a2>A2</a2>
    Text <strong>text</strong> text...
  </a>
  <a>
    <a2>A2</a2>
    Text <strong>text</strong> text...
  </a>  
</doc>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
    <xsl:copy-of select="//a[normalize-space(.)='A2 Text text text...']"/>
  </xsl:template>

</xsl:stylesheet>

XML 输出

  <a>
   <a2>A2</a2>
    Text <strong>text</strong> text...
  </a>
于 2012-05-03T15:23:12.560 回答