XSLT игнорирует элементы в шаблоне? - PullRequest
2 голосов
/ 06 марта 2011

У меня есть следующий 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 ]

6 голосов
/ 06 марта 2011

У вас есть два шаблона с абсолютно одинаковым шаблоном соответствия: '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' пра-пра-пра-родитель.

Я думаю, что вам нужно что-то вроде этого :

<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 голос
/ 06 марта 2011

Выглядит так, как будто у вас есть два шаблона, критерии совпадения которых совпадают (т. Е. Нет атрибутов режима или приоритета для их дифференциации).Если процессор обходит первый и обрабатывает второй, потому что он «выигрывает», то это будет иметь эффект, который вы наблюдаете (поскольку я предполагаю, что цель применения шаблонов внутри класса-дистрибутива - вызвать второй шаблон).

...