如何使用 XML 模式重用另一个模式/命名空间(即 XHTML)中的元素?

2023-12-27

我正在尝试定义一个架构,允许在某些地方使用特定的 (X)HTML 元素。我面临的问题是架构编译失败。

这是架构:

<?xml version="1.0"?>
<xs:schema
    xmlns:html="http://www.w3.org/1999/xhtml"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>

    <xs:import
        namespace="http://www.w3.org/1999/xhtml"
        schemaLocation="http://www.w3.org/MarkUp/Schema/xhtml11.xsd"
    />

    <xs:element name="foo">
        <xs:complexType>
            <xs:sequence>
                <xs:element
                    ref="html:blockquote"
                    minOccurs="0"
                    maxOccurs="unbounded"
                />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

这是 XML 文件:

<foo xmlns:html="http://www.w3.org/1999/xhtml">
    <html:blockquote>The quick brown fox jumped over the lazy dog.</html:blockquote>
</foo>

这是我收到的错误消息:

christian@armor01:~/testCase$ xmllint -schema foo.xsd -noout foo.xml
foo.xsd:12: element element: Schemas parser error : Element \
'{http://www.w3.org/2001/XMLSchema}element', attribute 'ref': The QName value \
'{http://www.w3.org/1999/xhtml}blockquote' does not resolve to a(n) element \
declaration.
WXS schema foo.xsd failed to compile

我明白错误消息的含义,但不明白为什么会发生错误。该错误消息意味着当我引用 blockquote 时,它​​找不到 blockquote。但我不明白为什么会发生这个错误,因为我正在导入 XHTML 1.1 架构。

我也试图找出这是否是一个特定的问题xmllint。所以我写了一个小Java程序来执行模式验证,但我基本上得到了同样的错误。

这是 Java 程序:

import java.io.*;
import java.net.*;
import javax.xml.*;
import javax.xml.parsers.*;
import javax.xml.validation.*;
import org.w3c.dom.*;

public class Validate {
    public static void main(final String... args) throws Exception {
        final SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        //dbf.setValidating(true);
        dbf.setSchema(schemaFactory.newSchema(new File(args[0]).toURI().toURL()));
        final DocumentBuilder db = dbf.newDocumentBuilder();
        final Document doc = db.parse(args[1]);
    }
}

这是我从该程序中得到的错误:

christian@armor01:~/testCase$ java Validate foo.xsd foo.xml
Exception in thread "main" org.xml.sax.SAXParseException; \
systemId: file:/home/christian/testCase/foo.xsd; \
lineNumber: 12; \
columnNumber: 88; \
src-resolve: Cannot resolve the name 'html:blockquote' to a(n) 'element declaration' component.

很明显,我在架构中做错了一些事情 - 但什么?定义重用来自另一个架构/命名空间(如 XHTML)的元素的架构(对于没有命名空间的目标语法)的正确方法是什么?

顺便说一句我也尝试过<xs:include/>但这对我来说似乎不合适,并且它失败了,因为它要求包含模式和包含模式针对相同的命名空间。


似乎“blockquote”元素没有定义为全局元素,因此您不能直接引用它。 如果您查看 xhtml 架构的子部分http://www.w3.org/MarkUp/SCHEMA/xhtml11-model-1.xsd http://www.w3.org/MarkUp/SCHEMA/xhtml11-model-1.xsd,你可以注意到它的类型是xhtml.blockquote.type.

因此,解决方法是像这样声明您的块引用:

<xs:schema xmlns:html="http://www.w3.org/1999/xhtml" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:import namespace="http://www.w3.org/1999/xhtml" schemaLocation="http://www.w3.org/MarkUp/Schema/xhtml11.xsd"/>
        <xs:element name="foo">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="blockquote" type="html:xhtml.blockquote.type" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

以及这个有效的 XML 实例:

<?xml version="1.0"?>
<foo xmlns:html="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test.xsd">
    <blockquote><html:p>quick brown fox jumped over the lazy dog.</html:p></blockquote>
</foo>

您会注意到 blockquote 元素未绑定到 html 命名空间。 由于您导入其他命名空间的元素,我认为为您自己的元素设置默认目标命名空间也是更好的做法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 XML 模式重用另一个模式/命名空间(即 XHTML)中的元素? 的相关文章

  • 在Android上使用XStream时如何注释order字段?

    我需要从 Android 上的 java 对象生成 XML XML 节点必须位于 确定的顺序 这是我得到的 这些字段按字母顺序排列
  • 如何在存储过程中查找数据表列引用

    我更改了 SQL Server 2005 数据库表中的列名称 我还有一个相当大的存储过程集合 它们可能引用也可能不引用该列 有没有办法找到哪些存储过程引用该列 而无需实际遍历每个存储过程并手动搜索它 有没有办法自动查找哪些存储过程现在会中断
  • 错误:使用 Microsoft WebService.dll 通过 Delphi7 规范化 XML

    我正在使用 Delphi7 修改旧项目以添加使用证书和签名 经过一番搜索后我发现XML 规范化函数 https learn microsoft com en us previous versions dd815358 v vs 85 但我无
  • 十六进制值 0X03 是无效字符

    这是一个网页的源码 p Da 32 brow 35 a G rn x3 icza p p 我需要浏览此页面并复制显示的文本 之后 我将此文本粘贴到 ASP NET MVC 应用程序的输入文本框中 以便在数据库中创建新记录 布局页面的元字符集
  • Android 键盘调整大小

    我正在开发一个应用程序 其中包含 Activity 和Fragment 在片段布局中 我使用相对布局作为父布局 底部和滚动视图之间的一个按钮 Scrollview包含编辑文本框 如果我点击最后一个editTextBox在滚动视图中我的键盘隐
  • 将 XML 文件读取到已存在的数据库表中

    我正在尝试将 XML 文件读入已存在的数据库表中 问题是 XML 标签和数据库列的名称不同 尽管它们具有相同的数据类型 因此 我想将 XML 标签 翻译 到数据库列中 以便可以输入数据库 不过我不知道该怎么做 这是我到目前为止所做的 sta
  • 添加节点后如何立即更新 XML 文档?

    所以我正在制作一个日历程序 当您向其中添加新条目时 我需要它进行更新 现在 我需要单击 xml 文件来更新它 然后其他一切都可以正常工作 宣言 private DocumentBuilderFactory documentFactory p
  • 使用 Smack 库解析 XMPP 的 EventElement

    任何人都可以帮助向我展示如何解析此事件 pub 元素并获取以下数据包的消息对象 也许我的关键字 搜索词谷歌搜索不正确 但我在寻找有关此问题的文档或教程时找不到任何有用的东西 我读过一些有关 PacketParserUtils 和 XmlPu
  • 格式良好的源代码

    源代码已使用换行符和空格进行格式化 Goals keep source formatting as long as lines fit in the screen horizontally e g pre 在左侧显示与行对齐的行号 例如 行
  • 使用 Java 根据本地 DTD 文件验证 XML 文件

    如何根据本地存储为文件的 DTD 验证 XML 文件 XML 文件没有任何 DOCTYPE 声明 或者可能有一个应该被覆盖的声明 我看了一下这个线程 https stackoverflow com questions 470313 net
  • Android SAXParser,解析成数组并获取子节点

    我正在开发一个小型应用程序 它使用 xml 文件来打印章节的 ArrayList 而该章节又指向特定的 html 文件 我使用本教程来开始 http www anddev org novice tutorials f8 parsing xm
  • 如何从 Oracle 中获取格式化的 XML

    我对 Oracle 缺乏经验 并且在将数据导出为 XML 时遇到问题 我已经设法让这个查询正常工作 但 XML 的格式似乎是固定的 对我来说不起作用 这是查询 SELECT value em getClobVal AS output FRO
  • 为什么 Android Studio 在应用设计中总是显示 ActionBar,即使在禁用时也是如此?

    我在新的 Android Studio 1 4 中有一个应用程序 尽管如此 这个问题在 1 3 2 中也存在 并且由于扩展功能 我决定使用工具栏而不是操作栏 我已经相应地设置了 xml 和 java 来隐藏 ActionBar 并且在编译时
  • 是否有更快的方法来检查 LINQ to XML 中的 XML 元素并解析 bool?

    仅供参考 这与我的上一个问题非常相似 是否有更快的方法来检查 LINQ to XML 中的 XML 元素 https stackoverflow com questions 2065665 is there a faster way to
  • 通过 Java Spring 构建 sitemap.xml [重复]

    这个问题在这里已经有答案了 我正在通过 Spring MVC 构建 sitemap xml XmlRootElement name urlset public class XmlUrlSet XmlElements XmlElement n
  • SQLite 查询查找主键

    在 SQLite 中 我可以运行以下查询来获取表中的列列表 PRAGMA table info myTable 这给了我列 但没有关于主键可能是什么的信息 此外 我可以运行以下两个查询来查找索引和外键 PRAGMA index list m
  • 在 Back 上按遍历最后两个选项卡在 BottomNavigationView 中无法正常工作?

    单击后退按钮后 导航到上一个打开的选项卡 您只需遍历最后打开的两个选项卡即可退出应用程序 如何实现 我只想遍历我打开的所有选项卡 然后应用程序应该退出 这是布局
  • 使用 lxml 和 xpath 解析 xml 文件时如何保留 &

    我试图从输入 xml 文件中提取一些信息 并使用 lxml 和 xpath 指令将其打印到输出文件中 我在读取如下所示的 xml 标签时遇到问题
  • lxml 属性需要完整的命名空间

    下面的代码使用 lxml python 3 3 从 Excel 2003 XML 工作簿中读取表格 该代码工作正常 但是为了通过 get 方法访问 Data 元素的 Type 属性 我需要使用键 urn schemas microsoft
  • 用于打开大(巨型、巨大、大)文本文件的文本编辑器[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐