使用XSLT基于属性值删除XML元素

时间:2015-02-09 07:53:13

标签: xml xslt

我在这里找不到解决问题的方法,所以请帮我找一种基于属性值过滤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>

1 个答案:

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