2013-08-13 3 views
0

덕분에 나는 내 자신의 XSLT를 생성하는 데 약간의 진전을 보였습니다. 그러나이 XML은 제가 완전히 갇혀 있고 제가 작업 한 것과 닮았습니다. 그것이 MS 오피스 스타일 시트를 사용하기 때문에 그것은 Excel에서 열리지 만 슬프게도 나는 자동화 된 프로세스로 작업하고 있습니다.변형 MS Office XML

내가 어떻게 달성 할 수 있는지에 대한 모든 단서가 환영받을 것입니다. 이 속으로

<?xml version="1.0" encoding="UTF-8"?> 
<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"> 
<ss:Styles/> 
<ss:Worksheet ss:Name="Information"> 
<ss:Table> 
<ss:Row> 
<ss:Cell> 
<ss:Data ss:Type="String">Name</ss:Data> 
</ss:Cell> 
<ss:Cell> 
<ss:Data ss:Type="String">Age</ss:Data> 
</ss:Cell> 
<ss:Cell> 
<ss:Data ss:Type="String">Unit</ss:Data> 
</ss:Cell> 
</ss:Row> 
<ss:Row> 
<ss:Cell> 
<ss:Data ss:Type="String">Sally</ss:Data> 
</ss:Cell> 
<ss:Cell> 
<ss:Data ss:Type="String">29</ss:Data> 
</ss:Cell> 
<ss:Cell> 
<ss:Data ss:Type="String">Greenford</ss:Data> 
</ss:Cell> 
</ss:Row> 
<ss:Row> 
<ss:Cell> 
<ss:Data ss:Type="String">Dave</ss:Data> 
</ss:Cell> 
<ss:Cell> 
<ss:Data ss:Type="String">45</ss:Data> 
</ss:Cell> 
<ss:Cell> 
<ss:Data ss:Type="String">Paddington</ss:Data> 
</ss:Cell> 
</ss:Row> 
</ss:Table> 
</ss:Worksheet> 
</ss:Workbook> 

:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<Report Title="Location"> 
<Record> 
<Name>Sally</Name> 
<Age>29</Age> 
<Unit>Greenford</Unit> 
</Record> 
<Record> 
<Name>Dave</Name> 
<Age>45</Age> 
<Unit>Paddington</Unit> 
</Record> 
</Report> 

감사

원시 XML 데이터를 변환.

답변

0

다음 스타일 시트는 원하는 출력 XML을 제공합니다.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" exclude-result-prefixes="ss"> 
    <xsl:output method="xml" encoding="ISO-8859-1"/> 
    <xsl:strip-space elements="*"/> 

    <!-- Match the table, output the root node and select the rows 
     excluding the row that contains the header. --> 
    <xsl:template match="ss:Workbook/ss:Worksheet/ss:Table"> 
    <xsl:text>&#xa;</xsl:text> 
    <Report Title="Location"> 
     <xsl:text>&#xa;</xsl:text> 
     <xsl:apply-templates select="ss:Row[not(position()=1)]"/> 
    </Report> 
    <xsl:text>&#xa;</xsl:text> 
    </xsl:template> 

    <!-- Now we're at a row. Match the data in each cell. --> 
    <xsl:template match="ss:Row"> 
    <Record> 
     <xsl:text>&#xa;</xsl:text> 
     <xsl:apply-templates select="ss:Cell/ss:Data"/> 
    </Record> 
    <xsl:text>&#xa;</xsl:text> 
    </xsl:template> 

    <!-- Output an element for each piece of data. --> 
    <xsl:template match="ss:Data"> 
    <!-- Find which column we are at. --> 
    <xsl:variable name="column" select="count(../preceding-sibling::ss:Cell) + 1"/> 
    <!-- The name of the element comes from the corresponding column 
    in the header (the first row). --> 
    <xsl:element name="{//ss:Workbook/ss:Worksheet/ss:Table/ss:Row[1]/ss:Cell[$column]/ss:Data}"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
    <xsl:text>&#xa;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 
+0

안녕하세요 - 많은 감사합니다. 변환을 적용하려고하면 예상 QName을 얻습니다. name = "{// ss : Workbook/ss : Worksheet/ss : Table/ss : Row [1]/ss : Cell [$ column]/ss : Data}" – Collider74

+0

이 XSL은 예제 XML과 함께 작동합니다. 액션 [여기]에서 볼 수 있습니다 (http://www.xmlplayground.com/51CV09). 다른 입력 XML에 적용하고 있습니까? –

+0

당신을 부인할 수 없습니다! XSLT를 제공하는 앱이어야합니다. 벤 감사. 그리고 저를 xmlplayground에 소개해 주셔서 감사합니다. 그게 아주 유용 할거야 :) – Collider74