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 的内置模板规则中的主要内容,如果未能解决你的问题,请参考以下文章