2017-07-02 41 views
1

我有以下的XML文件我轉換爲CSV,問題是,第一個數據部分是所有字符串標籤,我可以跳過,如果我需要和第二部分是字符串和int標記的混合。我能夠獲取數據,但頂部有一塊奇怪的數據塊,我無法刪除。該XML文件是自動生成的,所以我不能改變它。XSL問題處理零星和重複標籤去csv

<?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; 

的問題是,它貫穿於過程,並在一行上打印的一切擁有巨大的空間它打印我的期望輸出之前。我嘗試過使用這個網站上的其他例子,但我無法得到任何匹配。

回答

0

考慮<xsl:strip-space>刪除輸出頂部的間隙。然而,除去換行符變量和使用實體&#xa;<br>是一個html標籤),而且因爲只有​​攜帶任何文本,請在樣式表的模板:

<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 
+0

這一工程驚人爲我所問。我很抱歉,我忘了提及我有多個記錄。在表格部分有多個數組和表格數據表,它們可以保存多個結果,我把它剪掉了,所以我沒有把帖子弄亂,但是看起來我更加困難。 – LeotheDog

+0

請用幾個節點的實際XML更新您的文章以辨別圖案。 – Parfait