我正在尋找一種智能高效的XSLT,它將XML文檔轉換爲CSV數據。它應該處理子節點中所有可能的元素。 例如,XML看起來像這樣使用XSLT將XML轉換爲CSV
<?xml version="1.0" encoding="ISO-8859-1"?>
<sObjects>
<sObject>
<Name>Raagu</Name>
<BillingStreet>Hoskote</BillingStreet>
</sObject>
<sObject>
<Name>Rajath</Name>
<BillingStreet>BTM</BillingStreet>
<age>25</age>
</sObject>
<sObject>
<Name>Sarath</Name>
<BillingStreet>Murgesh</BillingStreet>
<location>Bangalore</location>
</sObject>
</sObjects>
而且我出去把CSV應該是這樣的
Name,BillingStreet,age,location
Raagu,Hoskote,,
Rajath,BTM,25,
Sarath,Murgesh,,Bangalore
所有的行應該在CSV所有鍵字段,即使如果XML確實有它的價值。
以下是我通過查看這裏的不同示例創建的XSLT代碼。
這是XSLT我想出了
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="delimiter" select="','"/>
<xsl:key name="field" match="sObject/*" use="name()"/>
<xsl:template match="/">
<xsl:for-each select="/*/*/*[generate-id()=generate-id(key('field', name())[1])]">
<xsl:value-of select="name()"/>
<xsl:if test="position() != last()">
<xsl:value-of select="$delimiter"/>
</xsl:if>
</xsl:for-each>
<xsl:text>
</xsl:text>
<xsl:for-each select="/*/sObject">
<xsl:variable name="property" select="." />
<xsl:for-each select="$property/*">
<xsl:variable name="value" select="." />
<xsl:value-of select="$value"/>
<xsl:if test="position() != last()">
<xsl:value-of select="$delimiter"/>
</xsl:if>
<xsl:if test="position() = last()">
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
,並打印出來放在
Name,BillingStreet,age,location
Raagu,Hoskote
Rajath,BTM,25
Sarath,Murgesh,Bangalore
但我想所有的行應包含那些多次值的所有鍵在第一行。
你能幫我用XSLT代碼實現嗎?
我們會提供幫助。當你卡住了。嘗試一下,並詢問是否有不清楚的地方。 [常見問題] – ppeterka 2013-03-05 14:24:15
可能有幾個類似問題的重複。請參閱「相關」下的鏈接。 – mzjn 2013-03-05 14:27:15
謝謝ppeterka。由於我是XSLT的新手,我一直在XSLT上嘗試不同的方式來完成這個任務。我寫了示例XSL代碼來獲取第一行(所有的鍵),但沒有得到邏輯來獲取正確位置的值。我看過相關的鏈接,並沒有找到解決我的問題。我現在被困在這一點,現在需要從Stackoverflow的幫助。 – 2013-03-05 14:27:20