首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在XSLT-3.0中将命名模板与"xsl:original“链接时发生”保留的命名空间“错误

在XSLT-3.0中将命名模板与"xsl:original“链接时发生”保留的命名空间“错误
EN

Stack Overflow用户
提问于 2019-12-24 07:08:21
回答 1查看 48关注 0票数 0

我尝试在XSLT3.0中使用"xsl:original“特性链接命名模板,但得到了一个保留名称名称空间错误。

作为示例,我使用在包含的两个样式表中定义的命名模板add-atts

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs" version="3.0">

  <xsl:template match="/">
    <root>
      <xsl:apply-templates select="root/line"/>
    </root>
  </xsl:template>

  <xsl:template match="line">
    <xsl:copy>
      <xsl:call-template name="add-atts"/>  <!-- USED HERE -->
      <xsl:apply-templates select="node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:import href="add-foo.xsl"/>  <!-- DEFINED HERE -->
  <xsl:import href="add-bar.xsl"/>  <!-- DEFINED HERE -->

</xsl:stylesheet>

第一个包含的样式表有一个命名模板,该模板添加了一个@foo属性:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs" version="3.0">

  <xsl:template name="add-atts">
    <xsl:attribute name="att1">foo</xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

第二个包含的样式表有一个同名的模板(由于排序,它优先),它添加了一个@bar属性,然后尝试从前一个文件中调用被覆盖的模板:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs" version="3.0">

  <xsl:template name="add-atts">
    <xsl:attribute name="att2">bar</xsl:attribute>
     <xsl:call-template name="xsl:original"/>  <!-- HERE -->
  </xsl:template>

</xsl:stylesheet>

当我在以下输入文件上运行此命令时

代码语言:javascript
复制
<root>
  <line>1</line>
  <line>2</line>
  <line>3</line>
</root>

我得到以下错误:

代码语言:javascript
复制
$ java -jar .../Saxon-HE-9.9.1-4.jar in.xml trans.xsl
Static error in xsl:call-template/@name on line 8 column 46 of add-bar.xsl:
  XTSE0080: Namespace prefix xsl refers to a reserved namespace
Errors were reported during stylesheet compilation

声明了xsl:名称空间,将XSLT版本设置为3.0,其用法与废弃的XSL-LIST邮件列表中的this example中的用法相同。我遗漏了什么?

(实际目的是在为DITA Open Toolkit创建插件时链接命名模板。)

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2019-12-24 16:21:49

该功能存在于包的新XSLT3特性的上下文中,请参阅https://www.w3.org/TR/xslt-30/#refer-to-overridden。无论是规范还是您链接到的线程,似乎都没有在简单的xsl:import上下文中引入此功能。

为了给您一个示例,说明如何在XSLT3中使用包,假设您有第一个包

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:package 
    name="http://example.com/packages/ex1"
    package-version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

    <xsl:template name="add-atts" visibility="public">
        <xsl:attribute name="att1">foo</xsl:attribute>
    </xsl:template>    

</xsl:package>

然后,您可以编写第二个包,覆盖该命名模板并使用<xsl:call-template name="xsl:original"/>

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:package 
    name="http://example.com/packages/ex2"
    package-version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

    <xsl:use-package name="http://example.com/packages/ex1">
        <xsl:override>
            <xsl:template name="add-atts" visibility="public">
                <xsl:attribute name="att2">bar</xsl:attribute>
                <xsl:call-template name="xsl:original"/>
            </xsl:template>           
        </xsl:override>
    </xsl:use-package>

</xsl:package>

最后,您可以使用第二个包:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs" version="3.0">

    <xsl:use-package name="http://example.com/packages/ex2"></xsl:use-package>

    <xsl:output indent="yes"/>

    <xsl:template match="/">
        <root>
            <xsl:apply-templates select="root/line"/>
        </root>
    </xsl:template>

    <xsl:template match="line">
        <xsl:copy>
            <xsl:call-template name="add-atts"/>  <!-- USED HERE -->
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

在命令行中使用Saxon时,在运行主样式表时,需要确保提供了两个包的文件名列表和-lib选项,例如Windows上的-lib:package1.xsl;package2.xsl和Linux上的-lib:package1.xsl:package2.xsl

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59462174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档