XML 和 XSL 中的前缀命名空间处理由 XML 解析器返回错误
Posted
技术标签:
【中文标题】XML 和 XSL 中的前缀命名空间处理由 XML 解析器返回错误【英文标题】:Prefixed namespace handling in XML and XSL returns error by XML parser 【发布时间】:2021-07-16 14:57:14 【问题描述】:我正在尝试使用 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>
【问题讨论】:
【参考方案1】:您引用的规范中的 https://www.w3.org/TR/xml-names/#nsc-NSDeclared 部分明确要求元素或属性名称中使用的前缀
命名空间前缀,除非是 xml 或 xmlns,否则必须是 在开始标记中的命名空间声明属性中声明 使用前缀的元素或祖先元素中的元素
因此,基本上您的输入示例在名称中使用前缀(如 xbrli:xbrl
)而没有任何命名空间声明不是命名空间格式良好的 XML,并且不能与任何 XSLT 处理器一起使用,因为 XPath 和 XSLT 在具有命名空间的 XML 上工作具有命名空间格式良好的 XML 输入。
【讨论】:
- 谢谢,这意味着我收到了一个缺少命名空间的错误 XML,但我可以添加命名空间声明,然后它可以与 XSLT 一起正常工作。【参考方案2】:您在转换中引用的命名空间未在输入文件中声明。
如果您修改输入文件以声明命名空间,如下所示:
<?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
【讨论】:
您的建议删除了所有错误。获得预期结果的唯一缺失是使在这种情况下应返回“瑞典”的“xsl:value-of”可见。 @Toolbox 查看我对 xsl:value-of 的更新答案。 我调整了 match="/xbrli:xbrl",然后 XML 数据值显示在最终结果中。我已批准你的回答。以上是关于XML 和 XSL 中的前缀命名空间处理由 XML 解析器返回错误的主要内容,如果未能解决你的问题,请参考以下文章