处理散列和重复标签的XSL问题转到csv

时间:2017-07-02 23:41:50

标签: xml csv xslt

我有以下XML文件我转换为csv,问题是,第一个数据部分是所有字符串标签,如果需要我可以跳过,第二部分是字符串和int标签的混合。我能够获取数据,但顶部有一个奇怪的数据块我无法删除。 XML文件是自动生成的,所以我无法更改它。

    <?xml version="1.0" encoding="utf-8"?>
    <methodResponse><params><param><value>
        <struct>
            <member><name>columns</name><value>
                <array><data>
                    <value><string>id</string></value>
                    <value><string>scanTime</string></value>
                    <value><string>host</string></value>
                    <value><string>vuln</string></value>
                    <value><string>port</string></value>
                    <value><string>protocol</string></value>
                </data></array>
            </value></member>
            <member><name>table</name>
<value>
                <array><data>
      <value>
        <array><data>
            <value><int>1</int></value>
            <value><int>1414010812</int></value>
            <value><string>Host.5</string></value>
            <value><string>Vuln.6230</string></value>
            <value><int>500</int></value>
            <value><string>udp</string></value>
        </data></array>
    </value>
    <value>
        <array><data>
            <value><int>2</int></value>
            <value><int>1414010978</int></value>
            <value><string>Host.6</string></value>  
            <value><string>Vuln.1191</string></value>
            <value><int>22</int></value>
            <value><string>tcp</string></value>
        </data></array>
    </value>
    <value>
        <array><data>
            <value><int>3</int></value>
            <value><int>1414010978</int></value>
            <value><string>Host.6</string></value>
            <value><string>Vuln.30535</string></value>
            <value><int>22</int></value>
            <value><string>tcp</string></value>
        </data></array>
    </value>
    <value>
        <array><data>
            <value><int>4</int></value>
            <value><int>1414010978</int></value>
            <value><string>Host.6</string></value>
            <value><string>Vuln.78682</string></value>
            <value><int>22</int></value>
            <value><string>tcp</string></value>
        </data></array>
    </value>
            </data></array>
            </value></member>
        </struct>
</value>
    </param>
    </params>
    </methodResponse>

**my XSL 1.0 code below**

        <xsl:variable name="new-line" select="'
    '"/>
        <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
        <xsl:template match="value/array/data">
           <xsl:for-each select="//array/data">
                    <xsl:for-each select="value">
                             <xsl:value-of select="translate(*, $new-line,' ')"/>,
                             </xsl:for-each><br/>;
            </xsl:for-each>
        </xsl:template>
    </xsl:stylesheet>

我想要的输出

    id,scanTime,host,vuln,port,protocol
    1,1414010812,Host.5,Vuln.6230,500,udp;
    2,1414010978,Host.6,Vuln.1191,22,tcp;
    3,1414010978,Host.6,Vuln.30535,22,tcp;
    4,1414010978,Host.6,Vuln.78682,22,tcp;
    5,1414010978,Host.6,Vuln.78683,22,tcp;

问题是它在整个过程中运行并在打印所需输出之前在一行上打印了大量空格。我尝试过使用本网站上的其他示例,但我无法匹配。

1 个答案:

答案 0 :(得分:0)

考虑<xsl:strip-space>删除输出顶部的差距。但是,删除换行符变量并使用实体&#xa;<br>是一个html标记)并且因为只有<member>包含任何文本,所以在样式表中运行该模板:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="member">
        <xsl:for-each select="descendant::array[last()]/data/value">
             <xsl:value-of select="*"/> 
             <xsl:if test="position() != last()">,</xsl:if>                 
        </xsl:for-each>
        <xsl:text>&#xa;</xsl:text>
    </xsl:template>

</xsl:stylesheet>

输出

id,scanTime,host,vuln,port,protocol
1,1414010812,Host.5,Vuln.6230,500,udp