2015-02-09 3 views
-1

Не удалось найти решение для моей проблемы здесь. Поэтому, пожалуйста, помогите мне найти способ фильтрации элементов XML-документа на основе значения атрибутов.Удаление элементов XML на основе значения атрибута с использованием XSLT

Очевидно, что для документа, как это:

<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

Каков желаемый результат для вашего нового примера? – JLRishe

+0

Аналогично предыдущему. –

+0

Итак, где же логика говорит, что элемент «Guy Levy» должен оставаться, но элементы «некоторого контента» должны быть удалены? Вы этого не объяснили. – JLRishe

ответ

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> 
Смежные вопросы