2014-05-09 65 views
1

我正在解析XML到CSV。閱讀文章@Convert an XML file to CSV file using java,並能夠驗證解決方案使用data.xml和style.xsl使用java(具有多個元素值)將XML文件轉換爲CSV文件

基於xml data.xml構建,想知道如果多個值是什麼樣的變化將需要對style.xsl呈現一些元素。

例如,如果多個OS分別在data.xml中有時存在

<?xml version="1.0"?> 
<Sites> 
<Site id="101" name="NY-01" location="New York"> 
<Hosts> 
    <Host id="1001"> 
    <Host_Name>srv001001</Host_Name> 
    <IP_address>10.1.2.3</IP_address> 
    <OS>Windows</OS> 
    <Load_avg_1min>1.3</Load_avg_1min> 
    <Load_avg_5min>2.5</Load_avg_5min> 
    <Load_avg_15min>1.2</Load_avg_15min> 
</Host> 
<Host id="1002"> 
    <Host_Name>srv001002</Host_Name> 
    <IP_address>10.1.2.4</IP_address> 
    <OS>Linux, Windows</OS> 
    <Load_avg_1min>1.4</Load_avg_1min> 
    <Load_avg_5min>2.5</Load_avg_5min> 
    <Load_avg_15min>1.2</Load_avg_15min> 
</Host> 
<Host id="1003"> 
    <Host_Name>srv001003</Host_Name> 
    <IP_address>10.1.2.5</IP_address> 
    <OS>Linux</OS> 
    <Load_avg_1min>3.3</Load_avg_1min> 
    <Load_avg_5min>1.6</Load_avg_5min> 
    <Load_avg_15min>1.8</Load_avg_15min> 
</Host> 
<Host id="1004"> 
    <Host_Name>srv001004</Host_Name> 
    <IP_address>10.1.2.6</IP_address> 
    <OS>Linux, NetBSD</OS> 
    <Load_avg_1min>2.3</Load_avg_1min> 
    <Load_avg_5min>4.5</Load_avg_5min> 
    <Load_avg_15min>4.2</Load_avg_15min> 
</Host>  

+0

你是什麼意思的多個值?你期望什麼樣的輸出? – helderdarocha

+0

以下鏈接似乎滿足您的要求。 http://stackoverflow.com/questions/3293371/convert-xml-file-to-csv-in-java – StackOverflow

+0

啊,你的意思是多個逗號分隔的文本值。您可以使用'translate'功能替換其他分隔符的逗號。 – helderdarocha

回答

1

試試這個方法吧?

<?xml version="1.0" encoding="utf-8"?> 
<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:text>Host_Name,IP_address,OS,Load_avg_1min,Load_avg_5min,Load_avg_15min&#10;</xsl:text> 
    <xsl:for-each select="Sites/Site/Hosts/Host"> 
     <xsl:value-of select="concat(Host_Name,',',IP_address,',&quot;',OS,'&quot;,',Load_avg_1min,',',Load_avg_5min,',',Load_avg_15min,'&#10;')"/> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

或者,如果你喜歡:

<?xml version="1.0" encoding="utf-8"?> 
<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:text>Host_Name,IP_address,OS,Load_avg_1min,Load_avg_5min,Load_avg_15min&#10;</xsl:text> 
    <xsl:for-each select="Sites/Site/Hosts/Host"> 
     <xsl:for-each select="*"> 
      <xsl:text>"</xsl:text> 
      <xsl:value-of select="."/> 
      <xsl:text>"</xsl:text> 
      <xsl:if test="position()!=last()"> 
       <xsl:text>,</xsl:text> 
      </xsl:if> 
     </xsl:for-each> 
     <xsl:if test="position()!=last()"> 
      <xsl:text>&#10;</xsl:text> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

注意,這兩個假設沒有你的 「場」 中包含了"引號。

+0

謝謝!像寶石一樣工作... – eugthom

0

如果在元件具有逗號分隔的值,則可以使用translate(node, character-to-be-replaced, replacement-character)轉化時替換它:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="Host"> 
     <xsl:value-of select="ancestor::Site/@id"/><xsl:text>, </xsl:text> 
     ... 

     <xsl:value-of select="@id"/><xsl:text>, </xsl:text> 
     <xsl:value-of select="Host_Name"/><xsl:text>, </xsl:text> 
     <xsl:value-of select="IP_address"/><xsl:text>, </xsl:text> 
     <xsl:value-of select="translate(OS, ',', ';')"/><xsl:text>, </xsl:text> 
     ... 
    </xsl:template> 

</xsl:stylesheet> 

您可以將它用於所有可能有逗號的元素,因爲如果未找到逗號,則文本將被複制而不做任何更改。

+0

謝謝,我們會在週末嘗試一下,然後回來。 – eugthom

+1

不需要用另一個分隔符替換逗號。 CSV完全能夠承載包含逗號的有效內容 - 您只需將該值用雙引號引起來即可。由於任何價值*可能被引用,你可以制定你的標準。 –

+0

當談到XSL時,我是一個noob(閱讀可憐)。試圖實現你的XSL邏輯,但失敗悲慘。你介意提供一個有效的XSL? – eugthom

相關問題