xslt 转换错误:XTSE0010:元素 xsl:mode 不得直接出现在 xsl:stylesheet 中

Posted

技术标签:

【中文标题】xslt 转换错误:XTSE0010:元素 xsl:mode 不得直接出现在 xsl:stylesheet 中【英文标题】:xslt transform error: XTSE0010: Element xsl:mode must not appear directly within xsl:stylesheet 【发布时间】:2020-10-09 08:07:03 【问题描述】:

我希望将节点从一个值更改为另一个值。不是节点的值,而是节点的名称。不是标签内的内容。

***会说“标签”为:

标签 标记是一种以 结尾的标记结构。标签有三种形式:

    start-tag, such as <section>;
    end-tag, such as </section>;
    empty-element tag, such as <line-break />.

所以我希望将一个名称的所有上述标签重命名为另一个名称。如foobarbarbaz

运行saxonb-xslt 返回:

Saxon 9.1.0.8J from Saxonica

也许这个版本的Saxon 没有功能,或者更可能的是xslt 有缺陷。

从较大的文件中截断xml

<csv>
  <foo>
    <entry>Reported_Date</entry>
    <entry>HA</entry>
    <entry>Sex</entry>
    <entry>Age_Group</entry>
    <entry>Classification_Reported</entry>
  </foo>
  <bar>
    <entry>2020-01-26</entry>
    <entry>Vancouver Coastal</entry>
    <entry>M</entry>
    <entry>40-49</entry>
    <entry>Lab-diagnosed</entry>
  </bar>
  <record>
    <baz>2020-02-02</baz>
    <entry>Vancouver Coastal</entry>
    <entry>baz</entry>
    <entry>50-59</entry>
    <entry>Lab-diagnosed</entry>
  </record>
  <record>
    <entry>2020-02-05</entry>
    <entry>Vancouver Coastal</entry>
    <entry>F</entry>
    <entry>20-29</entry>
    <entry>Lab-diagnosed</entry>
  </record>
</csv>

xslt 文件:

<?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="2.0">

    <xsl:output indent="yes"/>

  <xsl:mode on-no-match="shallow-copy"/>
  <xsl:template match="foo">
    <baz><xsl:apply-templates/></baz>
  </xsl:template>
</xsl:stylesheet>

错误:

Error at xsl:mode on line 9 column 41 of bc.rename.xslt:
  XTSE0010: Element xsl:mode must not appear directly within xsl:stylesheet
Error at xsl:mode on line 9 column 41 of bc.rename.xslt:
  XTSE0010: Unknown XSLT element: mode
Failed to compile stylesheet. 2 errors detected.

xml 文档和 xslt 文档都通过 xmllint 且没有错误。

【问题讨论】:

【参考方案1】:

xsl:mode 需要 XSLT 3.0。 AFAIK,Saxon 9.1 仅支持 XSLT 2.0。

试试吧:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="foo">
    <baz>
        <xsl:apply-templates/>
    </baz>
</xsl:template>

</xsl:stylesheet>

【讨论】:

正确,Saxon 9.1 可以追溯到 2009 年,早在 XSLT 3.0 发明之前。当前版本是 Saxon 10.1;中间有大约 50 个主要和次要版本。

以上是关于xslt 转换错误:XTSE0010:元素 xsl:mode 不得直接出现在 xsl:stylesheet 中的主要内容,如果未能解决你的问题,请参考以下文章

XSLT/XSL 递归嵌套元素

xslt 语法错误 <text> 元素

基于另一个变量的 XSLT 元素选择

选择字段元素时不确定 XSLT 文档中的当前路径

JavaEE XML XSL转换(XSLT)

XSLT