使用XSLT删除基于属性值的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> <

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

盖伊·利维
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>