2015-02-09 129 views
-1

我找不到解决我的问题的方法,请帮助我找到一种方法来根据属性的值过滤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> 

我想和元件,例如,属性类型= “1” 和类型= “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> 

由于求助!

UPDATE 对于某些或全部元素没有属性的记录,提供的解决方案将不实用。例如,下面的片段

<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

新示例需要的输出是什么? – JLRishe 2015-02-09 08:47:29

+0

和以前一样。 – 2015-02-09 08:48:23

+0

那么说“Guy Levy”元素应该保留的逻辑是什么,但是应该删除“一些内容”元素?你没有解释过。 – JLRishe 2015-02-09 08:49:14

回答

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>