2010-12-22 66 views
0

我有喜歡需要逆透視XML數據

<Results> 
    <Project> 
    <ID>111111</ID> 
    <Name>Test Project</Name> 
    <Abstract>This is a Test Project</Abstract> 
    <ShortName>Sample Project</ShortName> 
    <Language>ENG</Language> 
    </Project> 
</Results> 

需要每個元素轉換成以下各行

1st row: 111111,ENG,ID,111111 
2nd row: 111111,ENG,Name,Test Project 
3rd row: 111111,ENG,abstract, This is a Test Project 
4th row: 111111,ENG,shortName, Sample Project 

如何做到這一點的XML數據?

+0

您是否打算使用腳本語言?如果是這樣,哪一個? – 2010-12-22 17:22:19

回答

0

您是否可以使用XSLT來轉換XML?如果是這樣,下面的XSLT應該會對你有好處。

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" encoding="utf-8"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name='newline'><xsl:text> 
</xsl:text></xsl:variable> 

<xsl:template match="/Results/Project"> 
    <xsl:variable name="root" select="." /> 
    <xsl:for-each select="*"> 
     <xsl:value-of select="$root/ID/text()"/>,<xsl:value-of select="$root/Language/text()"/>,<xsl:value-of select="name()"/>,<xsl:value-of select="text()"/><xsl:value-of select="$newline"/> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 
0

這是一個有點晚的答案。 但是,這裏是SQL Server的解決方案:

declare @x xml = 
'<Results> 
    <Project> 
     <ID>111111</ID> 
     <Name>Test Project</Name> 
     <Abstract>This is a Test Project</Abstract> 
     <ShortName>Sample Project</ShortName> 
     <Language>ENG</Language> 
    </Project> 
</Results>' 

select x.x.value('ID[1]/text()[1]', 'varchar(100)') 
    + ',' 
    + x.x.value('Language[1]/text()[1]', 'varchar(100)') 
    + ',' 
    + y.y.value('local-name(.)', 'varchar(100)') 
    + ',' 
    + y.y.value('text()[1]', 'varchar(100)') 
from @x.nodes('/Results[1]/Project[1]')x(x) 
cross apply x.x.nodes('node()[not(local-name()="Language")]')y(y)