2014-09-09 3 views
0

У меня есть текущая таблица стилей, которая при применении к XML-файлу возвращается с родителями и дочерними элементами с пустыми полями.XSLT - Transform XML затем удаляет пустые родители и childern

Моего текущий XSLT выглядит следующим образом

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/"> 
<root> 
    <xsl:for-each select="pdml/packet"> 
     <PacketSRC id="{proto/field[@name='ip.src']/@show}"> 
      <PacketDST> 
       <xsl:value-of select="proto/field[@name='ip.dst']/@show"/> 
      </PacketDST> 
      <PacketFLAG> 
       <xsl:value-of select="proto/field[@name='tcp.flags']/@showname"/> 
      </PacketFLAG> 
      <PacketPORT> 
       <xsl:value-of select="proto/field[@name='tcp.dstport']/@show"/> 
      </PacketPORT> 
     </PacketSRC> 
    </xsl:for-each> 
</root> 
</xsl:template> 

</xsl:stylesheet> 

Когда преобразование завершено, некоторые целые PacketSRCs совершенно пусты в то время как другие имеют пустой PacketPORTs и PacketFLAGs.

Правильный результат выглядит следующим образом:

<PacketSRC id="192.168.1.211"> 
    <PacketDST>192.168.1.254</PacketDST> 
    <PacketFLAG>.... 0000 0000 0010 = Flags: 0x002 (SYN)</PacketFLAG> 
    <PacketPORT>3306</PacketPORT> 
</PacketSRC> 

Но из-за данных, доступ к некоторым может отображаться как (оба из которых нужно удаление):

<PacketSRC id=""> 
    <PacketDST></PacketDST> 
    <PacketFLAG></PacketFLAG> 
    <PacketPORT></PacketPORT> 
</PacketSRC> 

ИЛИ

<PacketSRC id="192.168.1.211"> 
    <PacketDST>192.168.1.254</PacketDST> 
    <PacketFLAG></PacketFLAG> 
    <PacketPORT></PacketPORT> 
</PacketSRC> 

Я посмотрел на другие ответы переполнения стека на помощь, но я не могу связать их с моим сценарием. Поэтому мой вопрос: если любое из значений или полей пуст, удалите его из окончательного преобразования.

+0

Проблема заключается в том, что вход сильно отличается, и причина для XSLT в первую очередь заключалась в сужении только определенных данных с определенного ввода. Три вышеупомянутых фрагмента XML - это выходы XSLT. – Taz

+1

Это очень поможет, если вы указали INPUT XML. Все, что вы показали, это XSLT и XML OUTPUT. –

+0

Стиль INPUT XML - это PDML. Если бы я должен был показать «Пакет», он мог бы резко измениться до следующего. Если вы понимаете, что я имею в виду. – Taz

ответ

0

Есть ли способ сделать это так, что если один из них (packetDST, packetFLAG, packetPORT) пусто, то перейти к следующему PDML/пакет?

Конечно, просто создать тест окружающей PacketSRC:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="/"> 
    <root> 
     <xsl:for-each select="pdml/packet"> 
     <xsl:if test="proto[ field[@name='ip.dst']/@show 
          and field[@name='tcp.flags']/@showname 
          and field[@name='tcp.dstport']/@show 
          ]"> 
      <PacketSRC id="{proto/field[@name='ip.src']/@show"> 
      <PacketDST> 
       <xsl:value-of select="proto/field[@name='ip.dst']/@show"/> 
      </PacketDST> 
      <PacketFLAG> 
       <xsl:value-of select="proto/field[@name='tcp.flags']/@showname"/> 
      </PacketFLAG> 
      <PacketPORT> 
       <xsl:value-of select="proto/field[@name='tcp.dstport']/@show"/> 
      </PacketPORT> 
      </PacketSRC> 
     </xsl:if> 
     </xsl:for-each> 
    </root> 
    </xsl:template> 

</xsl:stylesheet> 

И если вы хотите PacketSRC быть опущено, если у вас нет данных для его @id, вы можете проверить, что тоже:

<xsl:if test="proto[ field[@name='ip.src']/@show 
         and field[@name='ip.dst']/@show 
         and field[@name='tcp.flags']/@showname 
         and field[@name='tcp.dstport']/@show 
         ]"> 
+0

Есть ли способ сделать это так, что если один из них (packetDST, packetFLAG, packetPORT) пуст, переходите к следующему pdml/пакету? – Taz

+0

Потому что теперь есть некоторые, которые выглядят как: ' 192.168.1.254 ' , которые должны быть удалены. – Taz

+0

с небольшими твиками это прекрасно работает. – Taz

Смежные вопросы