Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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/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
Xml 选择使用XPath删除/筛选子元素的列表_Xml_Xpath - Fatal编程技术网

Xml 选择使用XPath删除/筛选子元素的列表

Xml 选择使用XPath删除/筛选子元素的列表,xml,xpath,Xml,Xpath,我试图创建一个XPath,这样它可以选择一个节点列表,并额外过滤一些数据,例如 <A> <B type="typea"> <data> <nodea>a</nodea> <nodeb>b</nodeb> <nodec>c</nodec> </data> </B> <B type="typeb"&g

我试图创建一个XPath,这样它可以选择一个节点列表,并额外过滤一些数据,例如

<A>
  <B type="typea">
    <data>
      <nodea>a</nodea>
      <nodeb>b</nodeb>
      <nodec>c</nodec>
    </data>
  </B>
  <B type="typeb">
    <data1>
      <nodea1>a1</nodea1>
      <nodeb1>b1</nodeb1>
      <nodec1>c1</nodec1>
      <noded1>d1</noded1>
    </data1>
  </B>
  <B type="typec">
    <data2>
      <nodeb2>b2</nodeb2>
      <nodec2>c2</nodec2>
    </data2>
  </B>
</A>

A.
B
C
a1
b1
c1
d1
b2
c2
转换为

  <B type="typea">
    <data>
      <nodea>a</nodea>
      <nodeb>b</nodeb>
      <nodec>c</nodec>
    </data>
  </B>
  <B type="typeb">
    <data1>
      <nodea1>a1</nodea1>
      <nodeb1>b1</nodeb1>
    </data1>
  </B>
  <B type="typec">
    <data2>
      <nodeb2>b2</nodeb2>
      <nodec2>c2</nodec2>
    </data2>
  </B>

A.
B
C
a1
b1
b2
c2
我尝试使用
/A/B[@type='typea'或@type='typeb'或@type='typec']
,但找不到筛选特定节点的子元素的方法。
是否有一种方法可以使用XPath筛选出节点B(type=“typeb”)的数据。

您只能使用XPath选择整个子树(无论哪个版本),而不能修改它们/构造新的子树。创建新结果需要XSLT或XQuery


使用XQuery,您可以选择要筛选的节点,并使用XQuery Update(如果支持)将其删除,否则您将不得不在节点上循环并重新创建所有节点,但要筛选的节点除外。

这不是单个XPATH,而是XSLT来完成您要求的操作:

```


```


请注意,您现有的XPATH用作基本选择器,然后两个模板负责处理它。第一个在XML中的任意位置对类型为
nodec1
noded1
的节点执行“无输出”;第二个复制所有其他内容。

现在,您的XPATH读取:在一个“查找所有B”中,它具有以下类型属性typea、typeb、typec之一。如果您只想排除typeb,可以将其从XPATH中删除。你想得到什么样的输出?除非您试图从类型B中排除nodec1和noded1?
<xsl:output method="xml"/>

<xsl:template match="/">
    <xsl:for-each select="/A/B[@type='typea' or @type='typeb' or @type='typec']">
        <xsl:apply-templates select="."/>
    </xsl:for-each>
</xsl:template>

<xsl:template match="*[name() = 'nodec1' or name() = 'noded1']">
</xsl:template>

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