选择没有特定子节点的节点

时间:2012-05-03 15:09:12

标签: xslt xpath lxml

例如,我有一个像这样的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>

3 个答案:

答案 0 :(得分:1)

不确定这是否足够灵活,但它应该让你开始

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

您可以在此处轻松使用它:http://www.xpathtester.com/test

答案 1 :(得分:1)

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

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

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

使用XQuery可以很容易地完成你想要的东西,并且(不那么容易)使用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>

答案 2 :(得分: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>