如何使用XML Schema重用另一个Schema / Namespace(即XHTML)中的元素?

克里斯蒂安·胡杰(Christian Hujer)

我正在尝试定义一个架构,该架构允许在某些地方使用特定的(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时,找不到它quotequote。但是我不明白为什么由于导入XHTML 1.1模式而发生此错误。

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

这是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.

很明显,我在模式中做错了什么-但是呢?定义可重用来自另一个Schema / Namespace(例如XHTML)的元素的Schema(针对不带名称空间的目标语法)的正确方法是什么?

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

钾肥

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

因此,一种解决方法是像这样声明您的blockquote:

<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命名空间。由于您导入了其他名称空间的元素,因此我认为将默认目标名称空间设置为您自己的元素也是一种更好的做法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

XML Schema(XSD):是否可以基于另一个元素为一个元素创建规则/关系?

来自分类Dev

如何重用另一个定义中的示例?

来自分类Dev

如何重用在另一个类的AsyncTask中创建的SSH(Jsch)会话

来自分类Dev

如何重用另一个JavaScript文件中的代码?

来自分类Dev

如何重用UI5 1.38中另一个应用程序的组件?

来自分类Dev

如何在reactjs的另一个应用程序中创建可重用组件?

来自分类Dev

如何重用解决方案中另一个项目的Web用户控件?

来自分类Dev

如何重用另一个bash文件中定义的功能?

来自分类Dev

如何在另一个 spec.js 中重用代码?

来自分类Dev

kotlin-如何在另一个参数中重用一个参数的值

来自分类Dev

如何在一个shell脚本中重用R变量到另一个shell脚本?

来自分类Dev

如何创建一个函数以供稍后在另一个函数中重用

来自分类Dev

如何使用量角器中的函数重用另一个 js 文件中的代码?

来自分类Dev

XML Schema和XML放在一个文件中?

来自分类Dev

针对在WSO2 ESB中导入另一个xsd的Schema验证XML

来自分类Dev

导出要在另一个 JavaScript 文件中重用的对象,而无需使用默认运算符

来自分类Dev

如何在布局中为另一个片段使用片段xml标签?

来自分类Dev

如何从 Fragment 中的另一个 XML 文件使用 FloatingActionButton

来自分类Dev

如何使用 PowerShell 从另一个文件更改 XML 中的值?

来自分类Dev

如何从另一个数据库获取SCHEMA.TABLES?

来自分类Dev

当不存在另一个参数时,需要使用JSON Schema的参数

来自分类Dev

使用JSON Schema对另一个属性进行验证

来自分类Dev

如何在一个文件中声明并从另一个文件中调用的参数中编程带有PHP的可重用函数?

来自分类Dev

如何使用一个xml文件中的信息在C#中创建另一个?

来自分类Dev

如何将一个MVC应用程序的部分视图重用到另一个MVC应用程序中

来自分类Dev

如何仅过滤XML文件的某些元素并使用批处理文件写入另一个XML文件

来自分类Dev

单击另一个元素时如何关闭另一个元素

来自分类Dev

将一个xml元素添加到另一个xml中

来自分类Dev

如何根据另一个列表中另一个元素的索引从列表中写出元素?

Related 相关文章

  1. 1

    XML Schema(XSD):是否可以基于另一个元素为一个元素创建规则/关系?

  2. 2

    如何重用另一个定义中的示例?

  3. 3

    如何重用在另一个类的AsyncTask中创建的SSH(Jsch)会话

  4. 4

    如何重用另一个JavaScript文件中的代码?

  5. 5

    如何重用UI5 1.38中另一个应用程序的组件?

  6. 6

    如何在reactjs的另一个应用程序中创建可重用组件?

  7. 7

    如何重用解决方案中另一个项目的Web用户控件?

  8. 8

    如何重用另一个bash文件中定义的功能?

  9. 9

    如何在另一个 spec.js 中重用代码?

  10. 10

    kotlin-如何在另一个参数中重用一个参数的值

  11. 11

    如何在一个shell脚本中重用R变量到另一个shell脚本?

  12. 12

    如何创建一个函数以供稍后在另一个函数中重用

  13. 13

    如何使用量角器中的函数重用另一个 js 文件中的代码?

  14. 14

    XML Schema和XML放在一个文件中?

  15. 15

    针对在WSO2 ESB中导入另一个xsd的Schema验证XML

  16. 16

    导出要在另一个 JavaScript 文件中重用的对象,而无需使用默认运算符

  17. 17

    如何在布局中为另一个片段使用片段xml标签?

  18. 18

    如何从 Fragment 中的另一个 XML 文件使用 FloatingActionButton

  19. 19

    如何使用 PowerShell 从另一个文件更改 XML 中的值?

  20. 20

    如何从另一个数据库获取SCHEMA.TABLES?

  21. 21

    当不存在另一个参数时,需要使用JSON Schema的参数

  22. 22

    使用JSON Schema对另一个属性进行验证

  23. 23

    如何在一个文件中声明并从另一个文件中调用的参数中编程带有PHP的可重用函数?

  24. 24

    如何使用一个xml文件中的信息在C#中创建另一个?

  25. 25

    如何将一个MVC应用程序的部分视图重用到另一个MVC应用程序中

  26. 26

    如何仅过滤XML文件的某些元素并使用批处理文件写入另一个XML文件

  27. 27

    单击另一个元素时如何关闭另一个元素

  28. 28

    将一个xml元素添加到另一个xml中

  29. 29

    如何根据另一个列表中另一个元素的索引从列表中写出元素?

热门标签

归档