XTDE0160:XSLT 1.0 兼容模式在此配置中不可用,在未命名模式下 /invoice:request 的内置模板规则中

Posted

技术标签:

【中文标题】XTDE0160:XSLT 1.0 兼容模式在此配置中不可用,在未命名模式下 /invoice:request 的内置模板规则中【英文标题】:XTDE0160 : XSLT 1.0 compatibility mode is not available in this configuration in buil-in template rule for /invoice:request in the unnamed mode 【发布时间】:2018-01-17 15:34:13 【问题描述】:

我总是遇到同样的问题。我已经创建了一个问题:未定义 value-of 上的命名空间前缀 xsl。感谢迈克尔的回答。我看到了所有类似的问题,但我发现没有任何帮助。我用 saxon9he 测试我的代码,并尝试用 muenchian 方法对其进行分组。 XML 文件:

<invoice:request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:invoice="http://www.xmlData.ch/xmlInvoice/XSD" 
    xsi:schemaLocation="http://www.forum-datenaustausch.ch/invoice MDInvoiceRequest_400.xsd" role="production">

    <invoice:invoice invoice_id="22">
      <invoice:vat>0.00</invoice:vat>
      <invoice:record_tarmed>Rapport médical sur formulaire assurance-maladie</invoice:record_tarmed>
  </invoice:invoice>
    <invoice:invoice invoice_id="23">
      <invoice:vat>5.00</invoice:vat>
      <invoice:record_tarmed>Salle d'examen et de traitement, chirurgie et chirurgie pédiatrique</invoice:record_tarmed>
   </invoice:invoice> 
</invoice:request>

XSLT 文件:

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:invoice="http://www.xmlData.ch/xmlInvoice/XSD"
  exclude-result-prefixes="invoice">

  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

  <xsl:key name="factures-par-TVA" match="invoice:invoice" use="invoice:vat"/>
  <xsl:template match="invoice:request">
    <Documents>
       <xsl:for-each select="invoice:invoice[count(. | key('factures-par-TVA', invoice:vat)[1]) = 1]">
          <xsl:sort select="invoice:vat" />
          <Document>
            <xsl:copy-of select="invoice:vat" />
            <xsl:for-each select="key('factures-par-TVA',invoice:vat)">
               <xsl:sort select="invoice:invoice/@invoice_id"/>
               <xsl:copy-of select="invoice:record_tarmed"/>
            </xsl:for-each>
          </Document>
        </xsl:for-each>
      </Documents>
    </xsl:template>
  </xsl:stylesheet>

结果是一样的:错误XTDE0160。如果我删除 'request' 的 'invoice:',则 temp.html 文件包含 4 个节点的文本,并且我收到此警告 SXXP0005:源文档位于命名空间 http://www.xmlData.ch/xmlInvoice/XSD,但所有模板规则都与 no 中的元素匹配命名空间。

我尝试了 xsl:template 的 mode 属性,但它不起作用。

我能做什么?

感谢您的帮助

【问题讨论】:

如果您使用的是 Saxon 9.8 HE,请确保您的样式表具有 version="3.0"version="2.0",Saxon 9.8 是 XSLT 3.0 处理器,并且 HE 已放弃对 version="1.0" 向后兼容性的支持。跨度> 另见saxonica.com/html/documentation/conformance/xslt30.html 说Saxon-HE will reject stylesheets that specify version="1.0" 和w3.org/TR/xslt-30/#err-XTDE0160。 因此,如果您的目标系统是 XSLT 1.0 处理器,我不建议使用 Saxon 9.8 HE 来测试您的样式表。 【参考方案1】:

正如 Martin 在他的 cmets 中指出的那样(这确实应该是一个答案),该消息意味着 Saxon9-HE 不再提供 XPath 1.0 兼容模式,因此它不会运行标有 version="1.0" 的样式表。最后一个提供此功能的开源 Saxon 版本是 Saxon 9.7,它当然仍然可用。

您不想继续使用 XSLT 2.0 或 3.0 可能是出于某种原因:xsl:for-each-group 指令使此类代码变得如此简单。

更新(2018 年 1 月 30 日):为响应大众需求,我们已恢复此更改。 Saxon-HE 9.8.0.7 的后续维护版本恢复了在向后兼容模式下运行 XSLT 1.0 样式表的能力。

【讨论】:

以上是关于XTDE0160:XSLT 1.0 兼容模式在此配置中不可用,在未命名模式下 /invoice:request 的内置模板规则中的主要内容,如果未能解决你的问题,请参考以下文章

Emacs nXML 模式中的 XSLT 2.0 支持

如何使用 XSLT 从 XML 中删除元素标记

使用 xslt 引用具有不同命名空间的元素

Firefox 不再解释 XSLT-1.0

如何在 xslt-1.0 中获取绝对值

将 XSLT 1.0 升级到 XSLT 2.0