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

我需要转换使用样式表以xml格式保存的Excel电子表格…但是我一直挂在ms使用的许多命名空间。 我需要一个允许每个元素传递的XSLT样式表 (默认情况下,当我使用样式表时,默认情况下会传递所有文本,否则只能传递我正在写入的元素模板)的inputxml。

这里是inputxml:

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与MS在inputXML中使用的命名空间…我似乎得到我的输出所有的数据,即使我只有一个元素模板(比如提取只有第一张纸的行)…什么样式的代码将得到上面的输出?

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

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

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

这是使用Mads的build议代码后编辑的样式表!

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

我还有一个问题,那就是在后续代码中没有提取实际的文本数据,为什么我不能获取文本数据。 我可以输出第一个variables“snid”,但是所有的文本variables都不会出现在输出中,即使我select了它们,而原始的源代码xml在这些条目中也有东西。 任何帮助这个新问题将不胜感激!

2月9日更新:

我解决了variables映射失败的问题。 这是一个简单的xpath错误,我正在寻找不存在的节点。 在单元格和它们的行之间有一对一的映射关系,所以variables应该被提取为单元[k] .Row [1] … Cell [k + 1] .Row [1] …等等。

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

  • 命名空间是从父节点inheritance而来的, <Worksheet>元素没有使用命名空间前缀,所以它可能不是很明显, WorksheetDataRowCell都绑定到同一个命名空间,并且需要ss:匹配标准。
    • 您已经正确地声明了urn:schemas-microsoft-com:office:spreadsheet命名空间,但未使用它来匹配所有内容。
  • ss:Worksheet模板中,您没有应用模板,因此处理停止。 我为ss:Table/ss:Row添加了一个apply-templates
  • 看起来好像你正在创build文本输出
    • 我将输出method="xml"更改为method="text"
    • 我换成了&#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> 

生成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文件复制过来。 请注意,输出中的元素(如Workbook)不属于任何名称空间

你会尝试这个好文章潜入SpreadsheetML(第2部分2)

无论如何,非常复杂的excel可以生成非常大的xml文件,所以在做一个完整的实现之前,对真实数据做一些testing