【问题标题】:XSLT ignores elements in template?XSLT 忽略模板中的元素?
【发布时间】:2011-03-06 01:36:11
【问题描述】:

我有以下 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 输出正常,但我没有:&lt;grade-dist&gt;&lt;/grade-dist&gt; 在其中,似乎完全忽略了两者,知道为什么吗?

谢谢,

【问题讨论】:

  • 好问题,+1。请参阅我的答案以获取解释和两种不同的解决方案。 :)

标签: xml xslt xslt-1.0


【解决方案1】:

您有两个匹配模式完全相同的模板:'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'grand-grand-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>

【讨论】:

  • 这样一个惊人的答案!非常感谢!解决了我的问题。
【解决方案2】:

看起来您有两个匹配标准相同的模板(即没有模式或优先级属性来区分它们)。如果处理器绕过第一个并处理第二个,因为它“获胜”,那么这将产生您正在观察的效果(因为我假设grade-dist 内的应用模板的目的是调用第二个模板) .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 2020-10-13
    • 2021-11-20
    相关资源
    最近更新 更多