如何使用简单的样式表转换ms excel xml?

时间:2011-02-06 22:17:39

标签: xml excel

我需要使用样式表转换以xml格式保存的excel电子表格...但我一直挂在ms使用的许多名称空间上。我需要一个 XSLT样式表,允许每个元素传递(默认似乎传递所有文本,当我使用样式表,否则只传递我正在编写的元素模板)输入xml。

这是输入xml:

http://apriority.dyndns.biz/im_cache/u_1/j_2390/2_9/tf/testexcel.xml

:我需要简单地从列中的两个工作表中提取数据,例如:

输出:

Sheet 1
1) blah, blue , burn, baste, belly, belie, bestow, betrothed, bemoan
2) quack, quagmire, quick, quantum, quant
3) alimony, ashy, amber, absolute, astrology, alabaster, angry
4) cost, curry, candor, cabin, capability, castor, canada

Sheet 2
1) 3
2) 32
3) 322
....etc.

我在样式表上遇到麻烦...与MS在输入xml中使用的命名空间有关...我似乎在输出中输入所有数据,即使我只有一个元素模板(比如说)用于提取仅第一张纸的行)...什么样式表代码将获得上面的输出???

这是我到目前为止的样式表:

http://apriority.dyndns.biz/im_cache/u_1/j_2390/2_9/tf/learningmap.xsl

文件放在非https网址上,所以没有病毒风险加上我使用我的真实姓名,谷歌我!

以下是Mads使用建议代码后编辑的样式表。

http://apriority.dyndns.biz/im_cache/u_1/j_2390/2_9/tf/learningmap_mod.xsl

我仍然遇到一个问题,即在后续代码中没有提取实际的文本数据,为什么我无法获取文本数据。我可以输出第一个变量“snid”,但所有文本变量都没有出现在输出中,即使我选择它们并且原始源xml在这些条目中有东西。任何有关这个新问题的帮助将不胜感激!

2月9日更新:

我解决了变量映射失败的问题。这是一个简单的xpath错误,我正在解决不存在的节点。在单元格及其行之间存在一对一的映射,因此变量应该被提取为Cell [k] .Row [1] ... Cell [k + 1] .Row [1] ... etc。

输出转换发生在我需要的时候,感谢对答案的贡献。这个很难判断哪个答案被接受了,因为这两个提交都是有帮助的,但这次我必须把它交给Mads Hanson。谢谢!

3 个答案:

答案 0 :(得分:1)

用于生成XML输出的XSLT版本:

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<xsl:output method="xml"/>

<xsl:template match="/">
    <Workbook>
        <xsl:for-each select="ss:Workbook/ss:Worksheet">
            <Worksheet>
                <Name><xsl:value-of select="@ss:Name"/></Name>
                <xsl:for-each select="ss:Table/ss:Row">
                    <Row>
                        <Number><xsl:number value="position()"/></Number>
                        <Data><xsl:for-each select="ss:Cell"><xsl:value-of select="ss:Data"/><xsl:if test="not(position()=last())">, </xsl:if></xsl:for-each></Data>
                    </Row>
                </xsl:for-each>
            </Worksheet>
        </xsl:for-each>
    </Workbook> 
</xsl:template>

</xsl:stylesheet>

从Excel XML文件复制了所需的名称空间声明。请注意,输出中的元素(如工作簿)不属于任何命名空间

答案 1 :(得分:1)

  • 命名空间是从父项继承的,<Worksheet>元素在没有名称空间前缀的情况下使用它,因此可能不会明显WorksheetDataRowCell都绑定到同一名称空间,并且每个匹配条件都需要ss:
    • 您已正确声明urn:schemas-microsoft-com:office:spreadsheet命名空间,但未使用它来匹配所有内容。
  • ss:Worksheet的模板中,您没有应用模板,因此处理停止了。我为apply-templates
  • 添加了ss:Table/ss:Row
  • 看起来好像在创建文本输出
    • 我将输出method="xml"更改为method="text"
    • 我将<br/>替换为&#xA;(换行符)

我修改了样式表以生成您显示的输出。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
         xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" >
    <xsl:output method="text"/>

    <xsl:template match="ss:Workbook">
        <xsl:apply-templates select="ss:Worksheet"/>
    </xsl:template>

    <xsl:template match="ss:Worksheet">
        <xsl:value-of select="@ss:Name"/>
        <xsl:text>:&#xA;</xsl:text>
        <xsl:apply-templates select="ss:Table/ss:Row" />
    </xsl:template>

    <xsl:template match="ss:Row">
        <xsl:apply-templates select="ss:Cell"/>
    </xsl:template>

    <xsl:template match="ss:Cell">
        <xsl:apply-templates select="ss:Data"/>
    </xsl:template>

    <xsl:template match="ss:Data">
        <xsl:value-of select="count(../preceding-sibling::ss:Cell) + 1"/>
        <xsl:text>)</xsl:text>
        <xsl:value-of select="."/>
        <xsl:text>&#xA;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

答案 2 :(得分:0)

你试试这篇好文章Dive into SpreadsheetML (Part 2 of 2)

无论如何,非常复杂的excel可以生成非常大的xml文件,因此在完成实现之前对实际数据进行一些测试