与模式属性集匹配的XSLT模板不起作用

时间:2013-07-27 06:29:27

标签: templates xslt match mode

xslt很新,我正在尝试编写用于生成PDF的xslt模板。

以下是传入xml的片段:

<element name="rootElement">
    <attributes />
    <elements>
        <element name="childElement">
            <attributes>
                <attribute name="attributename" value="Yes" />
            </attributes>
        </element>
    </elements>
</element>

除了以表格形式打印所有元素名称和相应的值之外,我还需要显示特定于每个子元素的文本。

在做了一些研究后,我认为这可以通过模板匹配和设置模式属性的组合来实现。这是我写的代码:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:template match="DOCUMENT">
        <xsl:apply-templates select="DATA" />
    </xsl:template>

    <xsl:template match="DATA">

        <xsl:apply-templates select="element" />
        <xsl:apply-templates select="element" mode="test" />

    </xsl:template>

    <xsl:template match="element">
        <fo:block font-size="18.0pt" font-family="Arial"
            font-weight="bold">
            Display something I.
        </fo:block>
    </xsl:template>

    <xsl:template match="element" mode="test">
        <fo:block font-size="18.0pt" font-family="Arial"
            font-weight="bold">
            Display something II.
        </fo:block>
    </xsl:template>
</xsl:stylesheet>

这是执行后的输出:

<?xml version="1.0" encoding="UTF-8"?>
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" font-size="18.0pt" font-family="Arial" font-weight="bold">
            Display something I.
</fo:block>

任何人都可以告诉我为什么模板匹配模式没有执行?

非常感谢任何想法/解决方案/见解。

2 个答案:

答案 0 :(得分:0)

由于没有DATA元素,因此必须从默认的内置模板调用match =“element”模板,该模板不会使用mode =“test”执行apply-templates。

答案 1 :(得分:0)

<xsl:template match="DOCUMENT"><xsl:template match="DATA">都不会被执行。

如果您将第二个模板更改为:

<xsl:template match="/">

    <xsl:apply-templates select="element" />
    <xsl:apply-templates select="element" mode="test" />

</xsl:template>

你应该看到你的预期结果。