版本属性在.xsl声明中的含义是什么

时间:2015-10-28 12:21:42

标签: xml xslt xpath

我是xslt的新手,一些基本问题困扰着我。其中之一是:

当我使用xslt 2.0处理器时,样式表中的version="1.0"意味着什么。即使我(在我的样式表中)非1.0函数,尽管我已经将样式表版本明确声明为1.0,但它仍然被处理。

对我来说,似乎version属性没有超出信息的属性。 它没有配置处理器。然后它服务于什么?

另一个问题是:

(xslt处理器),(xslt样式表)和(xpath)版本之间是否有任何关系?

提前谢谢。

1 个答案:

答案 0 :(得分:2)

请参阅http://www.w3.org/TR/xslt20/#backwards,如果XSLT 2.0处理器支持它,那么version="1.0"启用向后兼容处理,那么一个主要区别是<xsl:value-of select="foo"/>输出一个文本节点,其字符串值为第一个选中foo元素,version="2.0"将输出所有选定foo元素的值。

作为示例,请参阅http://xsltransform.net/6r5Gh2R,它处理输入

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <items>
        <item>foo</item>
        <item>bar</item>
    </items>
</root>

使用样式表

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:output indent="yes"/>

    <xsl:template match="/">
        <result>
            <result version="2.0">
                <xsl:apply-templates/>
            </result>
            <result version="1.0">
                <xsl:apply-templates mode="backwards"/>
            </result>       
        </result>
    </xsl:template>

    <xsl:template match="@*|node()" mode="#all">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" mode="#current"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="items">
        <xsl:copy>
            <xsl:value-of select="item"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="items" version="1.0" mode="backwards">
        <xsl:copy>
            <xsl:value-of select="item"/>
        </xsl:copy>
    </xsl:template>
</xsl:transform>

其中两个template match="items"处于不同模式且一个模板使用version="1.0",样式表的结果为

<?xml version="1.0" encoding="UTF-8"?>
<result>
   <result version="2.0">
      <root>
         <items>foo bar</items>
      </root>
   </result>
   <result version="1.0">
      <root>
         <items>foo</items>
      </root>
   </result>
</result>

根据value-of select="item"显示version评估的差异。