如何使用xsl转换具有复杂命名空间的嵌套xml?

时间:2016-07-28 16:12:06

标签: xml csv xslt

我正在尝试使用XSL将XML文件转换为CSV格式。有谁可以帮助我,我以前从未使用过XSL。这是我第一次。

XML文件:

<?xml version="1.0" encoding="UTF-8" ?>
<databook:databook xmlns:xsi="http://www.ww2g.org/2001/XMLSchema-instance" xmlns:databook="http://www.hello.com/arc/hi/model/databook" xsi:type="databook:HelloModelType">
<databook:property>
<version>1989</version>
<name>Current</name>
<fileName>Current</fileName>
<fileExtension>xls</fileExtension>
<description>Current Rates</description>
<created>2016-07-17-01.26.39.677445</created>
<databook:category id="1" name="Current"/>
<databook:datasheetNames>
<name>Current</name>
<name>Time</name>
</databook:datasheetNames>
</databook:property>
<databook:datasheet name="Current" isColumnBased="true">
<databook:columns>
<databook:column>
<databook:columnDefinition id="0" name="Gem" showName="Gem" type="String"/>
<cell>Gem</cell>
<cell>A1</cell>
<cell>A2</cell>
<cell>A3</cell>
</databook:column>
<databook:column>
<databook:columnDefinition id="0" name="IGT" showName="IGT" type="String"/>
<cell>IGT</cell>
<cell>B1</cell>
<cell>B2</cell>
<cell>B3</cell>
</databook:column>
</databook:columns>
</databook:datasheet>
<databook:datasheet name="Time" isColumnBased="true">
<databook:columns>
<databook:column>
<databook:columnDefinition id="0" name="Hello" showName="Hello" type="String"/>
<cell>Hello</cell>
<cell>C1</cell>
<cell>C2</cell>
<cell>C3</cell>
</databook:column>
<databook:column>
<databook:columnDefinition id="0" name="Hi" showName="Hi" type="String"/>
<cell>Hi</cell>
<cell>D1</cell>
<cell>D2</cell>
<cell>D3</cell>
</databook:column>
</databook:columns>
</databook:datasheet>
</databook:databook>

XSL文件:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL /Transform"     xmlns:fo="http://www.w3.org/1999/XSL/Format" >
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/datasheet">
<xsl:for-each select="//datasheet">
<xsl:value-of select="@name" /> 
<xsl:for-each select="//column">
<xsl:apply-templates select ="cell" />
</xsl:for-each> 
</xsl:for-each>
</xsl:template>
<xsl:template match="cell">         
<xsl:for-each select="//cell">
<xsl:value-of select="cell" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

预期产出如下:

sheetname=Current
Gem,A1,A2,A3
IGT,B1,B2,B3
sheetname=Time
Hello,C1,C2,C3
Hi,D1,D2,D3

我希望通过多张工作表,每张工作表内的列数以及每列下的单元格值进行迭代

1 个答案:

答案 0 :(得分:0)

以这种方式尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:databook="http://www.hello.com/arc/hi/model/databook">
<xsl:output method="text" />

<xsl:template match="/databook:databook">
    <xsl:for-each select="databook:datasheet">
        <xsl:text>sheetname=</xsl:text>
        <xsl:value-of select="@name" />
        <xsl:text>&#10;</xsl:text>
        <xsl:for-each select=".//databook:column">
            <xsl:for-each select="cell">
                <xsl:value-of select="." />
                <xsl:if test="position()!=last()">
                    <xsl:text>,</xsl:text>
                </xsl:if>
            </xsl:for-each> 
            <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

注意(1)使用前缀来处理命名空间中输入XML中的那些元素,以及(2)//.//之间的差异。