我在这里找不到解决问题的方法,所以请帮我找一种基于属性值过滤XML文档元素的方法。
显然,对于这样的文件:
<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>
我希望元素包含,例如,属性Type =“1”和Type =“3”:
<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>
感谢您的帮助!
更新 对于某些或所有元素没有属性的记录,提供的解决方案将不实用。例如,下面的片段
<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>
答案 0 :(得分:1)
使用模板进行简单的身份转换以匹配要删除的项目:
<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>