2017-07-02 6 views
1

私は以下のXMLファイルを持っています。私はcsvに変換しています。問題は、最初のデータセクションは必要な場合はスキップできます。 stringタグと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; 

問題は、それがプロセスを実行し、それが私の所望の出力を出力する前に、巨大なスペースで1行にすべてを印刷していることです。私はこのウェブサイトから他の例を使ってみましたが、私はマッチアップすることができません。

答えて

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