Xml 选择使用XPath删除/筛选子元素的列表
我试图创建一个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
<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>