2012-05-03 136 views
1

比如我有这样选择节点没有特定子

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

我如何使用XPath的XML样本选择节点a只包含

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

回答

1

不知道这是给你足够的灵活性,但它应该让你开始

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

你可以玩它很容易在这里:http://www.xpathtester.com/test

+0

不完全是我想要的,但我已经能够修改它。也感谢网站 –

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> 
+0

为什么downvote? –

+0

也许是因为XPath表达式根本没有选择节点? –

+0
1

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

切记:XPath表达式永远不会导致XML文档结构的模块化(例如删除节点)。

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

你想可以很容易地使用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> 
相关问题