XML 解析器在 XML 和 XSL returns 中处理带前缀的命名空间错误

Prefixed namespace handling in XML and XSL returns error by XML parser

我正在尝试使用 XSLT 处理 XML/XSL。 XML 和部分 XSL 包含前缀名称空间。我的理解是在 XSL 文件中有命名空间声明就足够了。

XML 文件必须有命名空间前缀,我没有选择将它们作为解决方案删除,因为它改变了 XML 数据结构。

我曾尝试在 XML 文件中声明 xbrli 命名空间,但错误与如果我将其排除在该文件中一样。

问题:我没有找到导致错误的原因,因此无法找出根本原因。

我用于故障排除的资源:

W3C - Namespaces in XML 1.0

W3C - XSL 2.0 Specification

Saxonica - Saxon documentation


XSLT 处理后出错:

Saxon-HE 10.5J from Saxonica
Java version 11.0.10
Using parser com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser
using class net.sf.saxon.tree.tiny.TinyBuilder
Error on line 3 column 13 of annual_report_example_3_xbrl_mini.xml:
  SXXP0003   Error reported by XML parser: The prefix "xbrli" for element "xbrli:xbrl" is
  not bound.: The prefix "xbrli" for element "xbrli:xbrl" is not bound.
org.xml.sax.SAXParseException; systemId: file:/Xxx; lineNumber: 3; columnNumber: 13; The prefix "xbrli" for element "xbrli:xbrl" is not bound.

XML 文件:

<?xml version="1.0" encoding="UTF-8" ?>

<xbrli:xbrl>
  <se-cd-base:Country>Sweden</se-cd-base:Country>
</xbrli:xbrl>

XSL 文件:

<?xml version="1.0" encoding="UTF-8" ?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xbrli="http://www.example.org/area-2"
  xmlns:se-cd-base="http://www.example.org/area-3"
  xmlns:ix="http://www.example.org/area-4"
  xmlns="http://www.w3.org/1999/xhtml"
  >

  <xsl:template match="/xbrli:xbrl">

    <html>

      <head>
        <title>MyTitle</title>
      </head>

      <body>
        <ix:nonNumeric name="se-cd-base:Country">
          <xsl:value-of select="se-cd-base:Country"/>
        </ix:nonNumeric>
      </body>

    </html>

  </xsl:template>

</xsl:stylesheet>

预期输出

<html>

      <head>
        <title>MyTitle</title>
      </head>

      <body>
        <ix:nonNumeric name="se-cd-base:Country">
          Sweden
        </ix:nonNumeric>
      </body>

  </html>

您在转换中引用的名称空间未在您的输入文件中声明。

如果您修改输入文件以声明命名空间,如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<xbrli:xbrl xmlns:xbrli="http://www.example.org/area-2" xmlns:se-cd-base="http://www.example.org/area-3">
  <se-cd-base:Country>Sweden</se-cd-base:Country>
</xbrli:xbrl>

你的转型成功了。

编辑: 您的 xsl:value-of 不起作用,因为您的模板正在选择根元素,但该值位于子元素中。只需将其替换为:

<xsl:value-of select="xbrli:xbrl/se-cd-base:Country"/>

看到它在这里工作:https://xsltfiddle.liberty-development.net/gVAkJ3L/1

您引用的规范中的 https://www.w3.org/TR/xml-names/#nsc-NSDeclared 部分明确要求有关元素或属性名称中使用的前缀

The namespace prefix, unless it is xml or xmlns, MUST have been declared in a namespace declaration attribute in either the start-tag of the element where the prefix is used or in an ancestor element

所以基本上您的输入示例在没有任何命名空间声明的情况下使用 xbrli:xbrl 等名称的前缀不是命名空间格式正确的 XML 并且不能与任何 XSLT 处理器一起使用,因为 XPath 和 XSLT 工作在 XML 上,在具有格式良好的命名空间 XML 输入的意义上使用命名空间。