可以将xsl版本1中的变量用于xsl版本2吗?

时间:2014-11-03 11:14:40

标签: xml xslt xslt-1.0 xslt-2.0

创建变量的第一个文件具有以下格式:

<xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
            xmlns:date="java.util.Date"                
            xmlns:vector="java.util.Vector"
            xmlns:xalan="http://xml.apache.org/xalan"                
            extension-element-prefixes="date vector xalan">
<xsl:output method="text" indent="yes" encoding="ISO-8859-1"/>

<xsl:variable name="MyVariableTemp">
    <A>
        <xsl:element name="elementA">
            <xsl:attribute name="A1">1</xsl:attribute>
            <xsl:attribute name="A2">2</xsl:attribute>
        </xsl:element>
        <!-- more elements -->
    </A>
</xsl:variable>
<xsl:variable name="MyVariable" select="xalan:nodeset($MyVariableTemp)"/>

我想要使用的第二个文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" 
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:date="java.util.Date"                
            xmlns:vector="java.util.Vector"                
            xmlns:math="java.lang.Math"
            xmlns:int="java.lang.Integer"
            xmlns:long="java.lang.Long"
            xmlns:double="java.lang.Double"
            xmlns:saxon="http://saxon.sf.net/"
            xmlns:xalan="http://xml.apache.org/xalan"
            xmlns:exsl="http://exslt.org/common"
            xmlns:bigint="java:java.math.BigInteger"
            extension-element-prefixes="date vector math int long double saxon xalan exsl bigint">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

有没有办法在第二个文件中使用该变量而不更改其中任何一个的版本?

我尝试过使用<xsl:include href="os_settings.xsl"/>

2 个答案:

答案 0 :(得分:0)

这取决于您要使用的XSLT处理器。如果您使用Xalan,那么它当然会识别并支持Xalan命名空间和对xalan:nodeset的调用。如果您使用Saxon,那么它将无法识别Xalan命名空间,并会在调用xalan:nodeset时抛出错误。因此,这不是您在版本属性中添加的版本的问题,而是您要使用哪个XSLT处理器的问题。如果主样式表使用XSLT / XPath 2.0功能,那么当然你不会使用Xalan运行该样式表,但这是一个不同的主题。

最近关于Saxon 9 exsl:node-set支持的一个类似问题,我认为建议实施扩展功能,例如。

<xsl:function name="xalan:nodeset()"/>
  <xsl:param name="seq"/>
  <xsl:sequence select="$seq"/>
</xsl:function>

这可能是Saxon的一种解决方法,你的包含或更好的导入模块应该定义虚函数,然后应该可以导入和使用其他模块。

答案 1 :(得分:0)

我设法解决了这个问题:

  • 我在版本1.0文件中添加了xmlns:exsl="http://exslt.org/common",而不是xalan:nodeset我使用了exsl:node-set
  • 我还必须从第一个文件中删除<xsl:output method="text" indent="yes" encoding="ISO-8859-1"/>,然后我才能使用<xsl:include href="os_settings.xsl"/>