XSLT用于选择特定元素和属性并输出到csv

时间:2014-11-05 00:39:42

标签: xslt

我试图将wireshark xml输出文件(pdml)的一些输出转换为csv文件。

我想选择属性名称= jen的proto元素。那个xml应该有一个名为field的子元素,其中show =" Discovery JEN :: Item1"。从我想要的那个节点

数据包将以下内容从以下xml复制到一行进行。

  • 使用show =" item1ID"从字段元素中提取show属性。和它的全部 children元素显示属性。所以输出将是show属性,例如item1ID LCMI siteID:0 applicationID:0 objectID:1
  • 使用show =" ODS ID"提取字段的子showame属性。这看起来像" HostIP:192.168.111.72(192.168.111.72)ProcessID:9588处理创建时间秒:1396466786计数器:2"
  • 有一个字段元素,其属性为show =" MIPSI mipsi"和一个子元素字段,其属性为show =" Time time"。我想提取那两个子字段元素的属性。该属性看起来像show =" 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>

Desired输出看起来像下面的

Discovery OMName:JEN-Item1-v4 OMTypeName:JEN :: Item1,siteID:0 applicationID:0 objectID:1,HostIP:192.168.111.72(192.168.111.72)ProcessID:9588 Process Create Time Sec:1396466786 counter:2 ,nanosecondsSince1970:1396466786788509000

1 个答案:

答案 0 :(得分:2)

第一件事:如果您希望输出为CSV,则将输出方法设置为“text”,并且不要复制源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,

我认为剩下的应该是非常明显的。