Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XPath筛选子节点_Xml_Xpath - Fatal编程技术网

Xml XPath筛选子节点

Xml XPath筛选子节点,xml,xpath,Xml,Xpath,我有一个包含以下信息的xml,我正在使用Xpath解析它 <root> <a> <b></b> <c></c> <d></d> </a> <a> <b></b> <c></c> <d></d> </a> </root>

我有一个包含以下信息的xml,我正在使用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”,我的目标是在XPath中进行过滤,而不是使用额外的代码,还有什么我能做的吗?谢谢

您可以通过使用下面的模式复制所有内容来过滤掉一个元素,只需截取要过滤掉的元素即可

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


这是因为特殊模板比常规模板具有更高的优先级。因此,第二种方法适用于除
a
下面的
d
之外的所有元素。第一个模板什么也不做,即忽略元素。< /P>如果我的(或者任何其他的未来答案)帮助你,请考虑通过点击答案左边的箭头来标记其中一个。这显示了哪个答案对您帮助最大,并为答案的作者(以及您!)分配了声誉分数。抱歉,新到这里,不知道传统,对您的答案添加了一些评论,帮助我们进行更多对话,谢谢!嗨,Patrick,谢谢你的帮助,我正在从一个Web服务器接收有效负载。我不认为我可以更改xml结构,将xml复制到一个新的速度太昂贵了,我正在进行的项目对性能至关重要,所以我正在寻找一种方法,一次过滤掉父标记中的标记。@user1409920这是“一次过滤”-我不理解你的评论,抱歉。对不起,对于英语,我想我可以做一些更详细的说明,我目前正在做的是使用“/root/a”获取包含所有“a”、“b”和“c”的节点,然后去掉“c”,我的意思是有没有一种方法可以在XPath中进行过滤,而不是使用额外的代码来进行过滤?thanks@user1409920请更新您的问题。我很难在不确切知道你们已经发生了什么转变的情况下给出答案。