2011-03-06 55 views
2

我有以下XSLT: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> 它,喜欢它似乎忽略了这两种完全,任何想法,为什么?

感谢,

+1

问得好,+1。请参阅我的答案以获得解释和两种不同的解决方案:) – 2011-03-06 02:13:54

回答

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> 
+0

这样一个惊人的答案!非常感谢你!解决了我的问题。 – snoofkin 2011-03-06 09:31:35

+1

+1。确实是彻底的。 – Flack 2011-03-06 10:25:58

1

看起来好像你有两个模板,其匹配标准是相同的(即没有模式或优先级属性来区分它们)。如果处理器绕过第一个并处理第二个,因为它“胜利”,那么这就会产生你正在观察的效果(因为我假定grade-dist中的apply-templates的目的是调用第二个模板) 。