2012-07-18 1 views
3

Я искал здесь, и я не могу найти, как фильтровать xml на основе их атрибута. У меня есть этот XML:Фильтровать XML на основе значения атрибута с помощью xslt

 




    <?xml version="1.0" encoding="utf-8"?> 
     <document> 
      <document_head> 
       <title>This is the title</title> 
       <version>This is the title</version> 
      </document_head> 
      <document_body> 
       <paragraph id="AXD"> 
        <text> 
         This is a text that should be in the result 
        </text> 
        <properties> 
         <size>13px</size> 
         <color>#000000</color> 
        </properties> 
        <author>Current user</author> 
       </paragraph> 
       <paragraph id="SFI"> 
        <properties> 
         <text> 
          This is some other text that should not be in there 
         </text> 
        </properties> 
       </paragraph> 
       <paragraph id="SFA"> 
        <author>Some random guy</author> 
       </paragraph>  
       <paragraph id="ARG"> 
        This doesn't mean anything. 
       </paragraph> 
       <paragraph id="RRR"> 
        This does, hence should be in there. 
       </paragraph> 
      </document_body> 
     </document> 

 

Я ожидал этот результат:

 


    <?xml version="1.0" encoding="UTF-8"?> 
    <document> 
     <document_head> 
      <title>This is the title</title> 
      <version>This is the title</version> 
     </document_head> 
     <document_body> 
      <paragraph id="AXD"> 
       <text> 
        This is a text that should be in the result 
       </text> 
       <properties> 
        <size>13px</size> 
        <color>#000000</color> 
       </properties> 
       <author>Current user</author> 
      </paragraph> 
      <paragraph id="RRR"> 
       This does, hence should be in there. 
      </paragraph>  
     </document_body> 
    </document> 

 

В настоящее время, у меня есть XSLT:

 


    <?xml version="1.0" encoding="utf-8"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:output method="xml" indent="yes"/> 
     <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
     </xsl:template> 

     <xsl:template match="document_body/paragraph[not(@id='AXD')][not(@id='RRR')]" /> 
    </xsl:stylesheet> 

 

который производит этот XML:

 




    <?xml version="1.0" encoding="UTF-8"?> 
     <document> 
      <document_head> 
       <title>This is the title</title> 
       <version>This is the title</version> 
      </document_head> 
      <document_body> 
       <paragraph id="AXD"> 
        <text> 
         This is a text that should be in the result 
        </text> 
        <properties> 
         <size>13px</size> 
         <color>#000000</color> 
        </properties> 
        <author>Current user</author> 
       </paragraph>  
      </document_body> 
     </document> 

 

Вы знаете, что мне не хватает?

Спасибо.

Обновление: Кажется, что код работает для другого XSLT-процессора, но не для Java Transformer.

+0

Уверены, что он не работает? Я просто попытался, и это действительно привело к ожидаемому результату! –

+0

@ tim-c Привет Тим. Да, я несколько раз пытался использовать Java, и ничего. Это дает мне результат, который я опубликовал. Кажется, что он не проверяет второе условие :( – StrayChild01

ответ

6

Я уверен, что ваше состояние должно работать! Тем не менее, вот несколько альтернативных способов проверки, поэтому попробуйте вместо этого посмотреть, не изменилось ли это.

<xsl:template match="document_body/paragraph[not(@id='AXD' or @id='RRR')]"/> 

<xsl:template match="document_body/paragraph[@id != 'AXD' and @id != 'RRR']"/> 
+0

Это работает! Большое спасибо. Боковой вопрос: возможно ли изменить это ИЛИ с помощью AND для сравнения? Я знаю, что это своего рода несвязанный, но это избавляет меня от другого вопроса здесь – StrayChild01

+0

Я не уверен, что полностью понимаю, но я отредактировал ответ на всякий случай. Возможно, другой вопрос был бы лучшим, в этом нет вреда! –

+0

Простите, что это касается самого оператора. И да, оба ответа работают. Большое спасибо. – StrayChild01