使用XSLT删除基于属性值的XML元素
我在这里找不到解决问题的方法,所以请帮助我找到一种基于属性值过滤XML文档元素的方法 显然,对于这样的文档:使用XSLT删除基于属性值的XML元素,xml,xslt,Xml,Xslt,我在这里找不到解决问题的方法,所以请帮助我找到一种基于属性值过滤XML文档元素的方法 显然,对于这样的文档: <records> <record> <Rec1>Guy Levy</Rec1> <Rec2 Type="1">72910589</Rec2> <Rec3 Type="2">some content</Rec3> <
<records>
<record>
<Rec1>Guy Levy</Rec1>
<Rec2 Type="1">72910589</Rec2>
<Rec3 Type="2">some content</Rec3>
<Rec4 Type="3">some content</Rec4>
<Rec5 Type="4">some content</Rec5>
<Rec6 Type="5">some content</Rec6>
<Rec7 Type="6">some content</Rec7>
</record>
<record>
<Rec1>Bruno Vang</Rec1>
<Rec2 Type="1">some content</Rec2>
<Rec3 Type="2">some content</Rec3>
<Rec4 Type="3">some content</Rec4>
<Rec5 Type="4">some content</Rec5>
<Rec6 Type="5">some content</Rec6>
<Rec7 Type="6">some content</Rec7>
</record>
</records>
盖伊·利维
72910589
一些内容
一些内容
一些内容
一些内容
一些内容
布鲁诺万
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
我想要具有属性Type=“1”和Type=“3”的元素:
盖伊·利维
72910589
一些内容
布鲁诺万
一些内容
一些内容
谢谢你的帮助
更新
对于某些或所有元素没有属性的记录,提供的解决方案不实用。例如,下面的片段
<record>
<Rec1>Guy Levy</Rec1>
<Rec2 Type="1">72910589</Rec2>
<Rec3>some content</Rec3>
<Rec4 Type="3">some content</Rec4>
<Rec5>some content</Rec5>
<Rec6>some content</Rec6>
<Rec7 Type="6">some content</Rec7>
</record>
盖伊·利维
72910589
一些内容
一些内容
一些内容
一些内容
一些内容
一个简单的身份转换,使用模板匹配要删除的项目即可:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="record/*[not(position() = 1 or
@Type = '1' or
@Type = '3')]" />
</xsl:stylesheet>
在示例输入上运行时,结果是:
<records>
<record>
<Rec1>Guy Levy</Rec1>
<Rec2 Type="1">72910589</Rec2>
<Rec4 Type="3">some content</Rec4>
</record>
<record>
<Rec1>Bruno Vang</Rec1>
<Rec2 Type="1">some content</Rec2>
<Rec4 Type="3">some content</Rec4>
</record>
</records>
盖伊·利维
72910589
一些内容
布鲁诺万
一些内容
一些内容
您的新示例所需的输出是什么?那么说“Guy Levy”元素应该保留,但“some content”元素应该删除的逻辑在哪里?你还没有解释,你是对的。我应该解释一下,第一个元素应该保留,其他元素根据属性值进行过滤。当然,这个问题可以用另一种更接近我的目标的形式来表述:只有与查询匹配的元素(所需属性的值)应该保留,其他元素应该删除,即使是第一个元素。
<records>
<record>
<Rec1>Guy Levy</Rec1>
<Rec2 Type="1">72910589</Rec2>
<Rec4 Type="3">some content</Rec4>
</record>
<record>
<Rec1>Bruno Vang</Rec1>
<Rec2 Type="1">some content</Rec2>
<Rec4 Type="3">some content</Rec4>
</record>
</records>