XSLT忽略模板中的元素?

时间:2011-03-06 01:36:12

标签: xml xslt xslt-1.0

我有以下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> 在它看来,它似乎完全忽略了,任何想法为什么?

谢谢,

2 个答案:

答案 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的目的是调用第二个模板)