2012-05-22 86 views
3

我有一个XML包含以下信息,我使用XPath来解析它XPath过滤子节点

<root> 
    <a> 
    <b></b> 
    <c></c> 
    <d></d> 
    </a> 
    <a> 
    <b></b> 
    <c></c> 
    <d></d> 
    </a> 
</root> 

我的目标是要获取标记的“A”的节点列表,并在每个子节点列表中包含“B '和'c'(等等过滤'd'!)我现在正在做的是使用'/ root/a'来获取包含所有'a','b'和'c'的节点,然后去掉' c'之后,我的目标是做XPA中的过滤而不是使用额外的代码,反正我可以做到吗?谢谢!

+0

如果我(或任何其他将来的答案)可以帮助您,请考虑通过单击答案左侧的箭头将其中一个标记为已接受。这显示了哪个答案对你最有帮助,并且将信誉点分配给答案的作者(和你!)。 – topskip

+0

抱歉,新到这里,不知道这个传统,加了一点对你的评论回答,帮助我们可以有更多的交谈,谢谢! – user1409920

回答

2

您可以通过复制下面的图案中的所有内容来滤除元素,并截取要滤除的元素。

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 


    <xsl:template match="a/d"/> 


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

</xsl:stylesheet> 

这是有效的,因为特殊模板比普通模板具有更高的优先级。所以第二个适用于除d以下的所有元素,低于a。第一个模板不做任何事情,即忽略元素。

+0

嗨,帕特里克,谢谢你的帮助,我从网络服务器接收有效载荷不认为我可以改变XML结构,复制XML到一个新的速度太昂贵,我正在工作的项目是性能的关键,所以我正在寻找一种方法可以一次过滤掉父标签中的标签。 – user1409920

+0

@ user1409920这是“一气呵成” - 我不明白你的评论,对不起。 – topskip

+0

对不起英国人,我想我可以给一些更详细的说明,我现在做的是使用'/ root/a'来获取包含所有'a','b'和'c'的节点,然后摆脱' c'之后,我的意思是有没有办法在XPath中进行过滤,而不是使用额外的代码来做到这一点?谢谢 – user1409920