XSLT忽略模板中的元素?

sno*_*kin 2 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'>
....
Run Code Online (Sandbox Code Playgroud)

我的XML输出正常,但我没有:<grade-dist>并且</grade-dist> 在其中,似乎它完全忽略了两个,任何想法为什么?

谢谢,

Dim*_*hev 6

您有两个模板具有完全相同的匹配模式: 'ss:Workbook/ss:Worksheet/ss:Table'

根据XSLT规范,这是一个可恢复的错误,这里观察到的恢复是最后一个模板被选中.

另一个观察是指令:

<xsl:apply-templates select='ss:Workbook/ss:Worksheet/ss:Table'/> 
Run Code Online (Sandbox Code Playgroud)

在模板匹配中'ss:Workbook/ss:Worksheet/ss:Table',很可能是错误的 - 不太可能存在'ss:Workbook/ss:Worksheet/ss:Table'具有'ss:Workbook/ss:Worksheet/ss:Table'祖父母的元素.

我想你想要的是这样的:

<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>
Run Code Online (Sandbox Code Playgroud)

或者只是:

<xsl:template match='ss:Workbook/ss:Worksheet/ss:Table'>
    <grade-dist>
      <!-- Do the processing here -->
    </grade-dist>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)