我需要使用样式表转换以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。谢谢!
答案 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>
元素在没有名称空间前缀的情况下使用它,因此可能不会明显Worksheet
,Data
,Row
,Cell
都绑定到同一名称空间,并且每个匹配条件都需要ss:
。
urn:schemas-microsoft-com:office:spreadsheet
命名空间,但未使用它来匹配所有内容。 ss:Worksheet
的模板中,您没有应用模板,因此处理停止了。我为apply-templates
ss:Table/ss:Row
method="xml"
更改为method="text"
<br/>
替换为

(换行符)我修改了样式表以生成您显示的输出。
<?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>:
</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>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
你试试这篇好文章Dive into SpreadsheetML (Part 2 of 2)
无论如何,非常复杂的excel可以生成非常大的xml文件,因此在完成实现之前对实际数据进行一些测试