我有以下XSLT:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="ss:Workbook/o:DocumentProperties/o:*"/>
<xsl:template match="ss:Workbook/x:ExcelWorkbook/x:*"/>
<xsl:template match="ss:Workbook/x:ExcelWorkbook/x:*"/>
<xsl:template match="ss:Workbook/ss:Worksheet/x:WorksheetOptions/x:*"/>
<xsl:template match="ss:Workbook/ss:DocumentProperties/ss:*"/>
<xsl:template match='ss:Workbook/ss:Worksheet/ss:Table'>
<grade-dist>
<xsl:apply-templates select='ss:Workbook/ss:Worksheet/ss:Table'/>
</grade-dist>
</xsl:template>
<xsl:template match='ss:Workbook/ss:Worksheet/ss:Table'>
....
我的XML输出正常,但我没有:<grade-dist>
和</grade-dist>
在它看来,它似乎完全忽略了,任何想法为什么?
谢谢,
答案 0 :(得分:6)
您有两个匹配模式完全相同的模板:'ss:Workbook/ss:Worksheet/ss:Table'
根据XSLT规范,这是一个可恢复的错误,此处观察到的恢复是最后一个模板被选中。
另一个观察是指令:
<xsl:apply-templates select='ss:Workbook/ss:Worksheet/ss:Table'/>
在匹配'ss:Workbook/ss:Worksheet/ss:Table'
的模板中,很可能是错误的 - 不太可能有'ss:Workbook/ss:Worksheet/ss:Table'
元素具有'ss:Workbook/ss:Worksheet/ss:Table'
盛大-parent。
我认为你想要的是这样的:
<xsl:template match='ss:Workbook/ss:Worksheet/ss:Table'>
<grade-dist>
<xsl:apply-templates select="." mode="pr2"/>
</grade-dist>
</xsl:template>
<xsl:template mode="pr2" match='ss:Workbook/ss:Worksheet/ss:Table'>
<!-- Some necessary processing -->
</xsl:template>
或只是:
<xsl:template match='ss:Workbook/ss:Worksheet/ss:Table'>
<grade-dist>
<!-- Do the processing here -->
</grade-dist>
</xsl:template>
答案 1 :(得分:1)
看起来好像你有两个匹配标准相同的模板(即没有模式或优先级属性来区分它们)。如果处理器绕过第一个并处理第二个因为它“胜利”,那么这将产生你正在观察的效果(因为我认为grade-dist中的apply-templates的目的是调用第二个模板)