首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XML和XSL中的前缀命名空间处理通过XML解析器返回错误

XML和XSL中的前缀命名空间处理通过XML解析器返回错误
EN

Stack Overflow用户
提问于 2021-04-22 11:28:13
回答 2查看 393关注 0票数 2

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

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

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

问题:我找不到导致错误的原因,因此无法隔离根本原因。

用于故障排除的资源:

XML1.0中的W3C名称空间

W3C -XSL2.0规范

萨克森-萨克森文档

XSLT处理后的错误:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" ?>

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

XSL文件:

代码语言:javascript
复制
<?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>

预期输出

代码语言:javascript
复制
<html>

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

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

  </html>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-22 12:35:23

您在转换中引用的命名空间没有在输入文件中声明。

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

代码语言:javascript
复制
<?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不起作用,因为您的模板正在选择根元素,但是值位于子元素中。只需将其替换为:

代码语言:javascript
复制
<xsl:value-of select="xbrli:xbrl/se-cd-base:Country"/>

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

票数 3
EN

Stack Overflow用户

发布于 2021-04-22 13:43:07

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

除非是xml或xmlns,否则命名空间前缀必须已在使用前缀的元素的开始标记或祖先元素的命名空间声明属性中声明。

因此,基本上,您使用名称(如xbrli:xbrl )中的前缀而没有任何名称空间声明的输入示例不是名称空间格式良好的XML,不能与任何XSLT处理器一起使用,因为XPath和XSLT在具有名称空间的XML上工作,即有一个名称空间格式良好的XML输入。

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

https://stackoverflow.com/questions/67212358

复制
相关文章

相似问题

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