2011-03-06 52 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的目的是調用第二個模板) 。