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



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

<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"/>

这取决于要使用的XSLT处理器。如果您使用Xalan,那么它当然会识别并支持Xalan名称空间和对xalan:nodeset的调用。如果您使用Saxon,那么它将无法识别Xalan名称空间,并将在对xalan:nodeset的调用中引发错误。因此,这不是您将哪个版本放入版本属性的问题,而是您希望使用哪个XSLT处理器的问题。如果主样式表使用XSLT/XXPath2.0特性,那么Xalan运行该样式表当然不会有太多进展,但这是另一个主题。

在最近关于Saxon 9中exsl:node-set支持的类似问题中,我认为有人建议将扩展功能实现为例如

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

这可能是Saxon的一个变通方法,您的include或更好的导入模块应该定义该伪函数,然后应该可以导入并使用其他模块。

我设法解决了这个问题:

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

相关内容

  • 没有找到相关文章

最新更新