2014-11-05 84 views
1

我试图将wireshark xml输出文件(pdml)的某些输出转换为csv文件。XSLT用于选择特定元素和属性并输出到csv

我想选择属性name = jen的proto元素。这个XML应该有一个名为field的子元素,其中show =“Discovery JEN :: Item1”。从同一节点我想

数据包里的东西从下面的xml复制到一行来做。

  • 从show =“item1ID”的字段元素中提取show属性,并且其所有 children元素都显示属性。所以输出将是节目属性,例如item1ID LCMI siteID:0 applicationID:0 objectID:1
  • 使用show =“ODS ID”提取字段的子显示属性。这看起来像“HostIP:192.168.111.72(192.168.111.72)ProcessID:9588进程创建时间秒:1396466786计数器:2”
  • 有一个字段元素的属性show =“MIPSI mipsi”和一个子元素字段与属性show =“Time time”。我想提取这两个子字段元素的属性。该属性看起来像显示=“nanosecondsSince1970:1396466786788509000”

我写了一点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="packet/proto[@name="jen]"> 
    <xsl:copy> 
     <xsl:apply-templates select="*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="field[@show='Discovery OMName: JEN-Item1-v4 OMTypeName: JEN::Item1']"> 
    <xsl:value-of select="@show"/> 
</xsl:template> 

<xsl:template match="field[@show='item1ID']"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="field[@show='JEN Update Header']"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="field[@show='MIPSI mipsi']"> 
    <xsl:template match="field[@show='Time time']"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:template> 
</xsl:stylesheet> 

XML例如


<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="pdml2html.xsl"?> 

<pdml version="0" creator="wireshark/1.10.10" time="Mon Oct 20 16:46:32 2014" capture_file="C:\Users\someone\Documents\ABC\Test Files\ToSave\Item1_multicast.pcapng"> 
<packet> 
<proto name="jen" showname="JEN" size="501" pos="134"> 
    <field name="" show="Header Data" size="0" pos="134" value=""> 
     <field name="" show="TAO RTEC Event Header" size="0" pos="134" value=""> 
     <field name="" show="Number Of Events: 1" size="4" pos="134" value="01000000"/> 
     <field name="" show="EventType: ReflectionMessageEvent_t" size="4" pos="142" value="e8030000"> 
      <field name="jen.eventType" showname="Event Type: 30" size="4" pos="280" show="30" value="1e000000"/> 
     </field> 
     </field> 
     <field name="jen.payloadtype" showname="Payload Type: 0" size="4" pos="218" show="0" value="00000000"/> 
    </field> 
    <field name="" show="Discovery OMName: JEN-Item1-v4 OMTypeName: JEN::Item1" size="8" pos="426" value="3421836700000000"/> 
    <field name="" show="Discovery JEN::Item1" size="0" pos="434" value=""> 

     <field name="" show="item1ID" size="0" pos="442" value=""> 
     <field name="" show="LCMI" size="1" pos="442" value="73"/> 
     <field name="" show="siteID: 0" size="2" pos="444" value="0000"/> 
     <field name="" show="applicationID: 0" size="2" pos="446" value="0000"/> 
     <field name="" show="objectID: 1" size="4" pos="450" value="01000000"/> 
     </field> 

    <field name="" show="JEN Update Header" size="0" pos="476" value=""> 
     <field name="" show="ODS ID" size="0" pos="476" value=""> 
     <field name="jen.ods.hostip" showname="HostIP: 192.168.111.72 (192.168.111.72)" size="4" pos="478" show="192.168.111.72" value="c0a86f48"/> 
     <field name="jen.ods.process" showname="ProcessID: 9588" size="4" pos="482" show="9588" value="74250000"/> 
     <field name="jen.ods.time" showname="Process Create Time Sec: 1396466786" size="4" pos="486" show="1396466786" value="62643c53"/> 
     <field name="jen.ods.counter" showname="counter: 2" size="4" pos="490" show="2" value="02000000"/> 
     </field>  
    </field> 
    <field name="" show="JEN::Item1 0-0-1" size="0" pos="530" value=""> 
     <field name="" show="length: 81" size="4" pos="534" value="51000000"/> 

     <field name="" show="JENAffiliation affiliation=Affiliation_Unknown" size="4" pos="542" value="00000000"/> 

     <field name="" show="MIPSI mipsi" size="0" pos="554" value=""> 
     <field name="" show="LCMI" size="1" pos="554" value="73"/> 
     <field name="" show="Optional Attribute Bit Set" size="1" pos="555" value="00"/> 
     <field name="" show="Time time" size="0" pos="556" value="">   
      <field name="" show="nanosecondsSince1970: 1396466786788509000" size="8" pos="562" value="480529cf243f6113"/> 
     </field> 
     </field> 
    </field> 
    </proto> 
</packet> 
</pdml> 

所需的输出看起来像下面

发现OMName:JEN-项目1-V4 OMTypeName:JEN :: Item1,siteID:0 applicat ionID:0 objectID:1,HostIP:192.168.111.72(192.168.111.72)ProcessID:9588 Process Create Time Sec:1396466786 counter:2,nanosecondsSince1970:1396466786788509000

+0

你的目标不明确。你想从你提到的领域中提取什么? – 2014-11-05 01:06:14

+0

@ michael.hor257k对不起,我只是编辑它显示更多信息。希望在期望的输出和该信息之间更清楚。 – 2014-11-05 01:10:04

+0

恐怕我仍然没有遵循:你说“*用show = ... *”从字段元素中提取show属性。这里没有什么可以提取的;你已经知道'show'属性包含了什么。 – 2014-11-05 01:14:50

回答

2

第一件事:如果您希望输出为CSV,将您的输出方法设置为“文本”,并且不要复制源XML的元素。

这里的东西,你可以为你的出发点使用:

XSLT 1.0

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

<xsl:template match="/"> 
    <xsl:for-each select="pdml/packet/proto[@name='jen']"> 
     <xsl:text>Discovery OMName: JEN-Item1-v4 OMTypeName: JEN::Item1,</xsl:text> 

     <xsl:text>item1ID,</xsl:text> 
     <xsl:for-each select="field[@show='item1ID']/field"> 
      <xsl:value-of select="@show"/> 
      <xsl:text>,</xsl:text> 
     </xsl:for-each> 

     <!-- more of the same --> 

    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

应用到你的输入(!以后纠正畸形的一部分),这将返回:

Discovery OMName: JEN-Item1-v4 OMTypeName: JEN::Item1,item1ID,LCMI,siteID: 0,applicationID: 0,objectID: 1, 

其余的应该很明显,我想。

相关问题