Schematron

1、XML Schema:

?定义可出现在文档中的元素
?定义可出现在文档中的属性
?定义哪个元素是子元素
?定义子元素的次序
?定义子元素的数目
?定义元素是否为空,或者是否可包含文本
?定义元素和属性的数据类型
?定义元素和属性的默认值以及固定值

 

2、XML  Schematron:

Schematron 文档基本上是一组应用于 XML 数据的约束。可以以两种方式之一表达具体的 Schematron 约束:
      作为断言,这意味着对应用于实例文档的特定条件进行测试。实例文档要想有效,所有断言的计算结果都必须是 true。
      作为报告,在这种情况下也对应用的条件进行测试。但是,测试的意义与断言的意义正好相反。如果测试结果是 true,那么文档将处于无效状态。
Schematron 允许将断言和报告一起分组在称为规则 的结构中,然后将这些规则一起分组在模式 中。

可以使用 XPath 指定测试条件,还可以指定应用测试条件的上下文。Schematron 作者还可以提供在违反条件时应用的文本。这些文本应该是人可阅读的,用来向正在操纵数据实例的最终用户进行说明。另外,这些文本也可以具有更强的技术性,从而向正在构造 XML 实例的 XML 开发人员指出 XML 实例必须符合给定 Schematron 文档中定义的约束。

在本文中,我们使用 清单 1 中的简单 XML 实例文档。


清单 1. 简单 XML 文档
            <?xml version="1.0"?>
            <root xmlns="http://www.example.org"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.example.org Simple.xsd">
            <A>100</A>
            <B>0</B>
            </root>


清单 1 中的 XML 实例文档引用一个称为 Simple.xsd 的模式,这个模式的内容见 清单 2。


清单 2. 简单 XML 文档的 XML 模式
            <?xml version="1.0" encoding="UTF-8"?>
            <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.example.org"
            xmlns:ex="http://www.example.org"
            elementFormDefault="qualified">
            <xsd:element name="root" type="ex:rootType"/>
            <xsd:complexType name="rootType">
            <xsd:sequence>
            <xsd:element name="A" type="xsd:integer"/>
            <xsd:element name="B" type="xsd:integer"/>
            </xsd:sequence>
            </xsd:complexType>
            </xsd:schema>


清单 2 中的 XML 模式文档声明元素 A 和元素 B 的类型是 integer。但是,XML 模式无法定义对这两个元素的值的约束 —— 例如,它们的和等于 100。但是,在 Schematron 中很容易定义这个约束,见 清单 3。


清单 3. 简单 XML 文档的 Schematron 定义
            <?xml version="1.0"?>
            <sch:schema xmlns:sch="http://www.ascc.net/xml/schematron">
            <sch:title>AB Example</sch:title>
            <sch:ns uri="http://www.example.org" prefix="ex" />
            <sch:pattern name="Our Only Pattern" id="pattern1">
                  <sch:rule context="/ex:root" id="sum100">
                       <sch:assert test="ex:A + ex:B = 100">
                              The sum of the values of A and B must be 100.
                       </sch:assert>
                </sch:rule>
            </sch:pattern>
            </sch:schema>


尽管目前对 Schematron 的介绍还很简短,但是您可以很容易地看出这个文档的作用。对于应用这个文档的任何 XML 数据,A 和 B 的和值必须等于 100,这是由惟一的 assert 元素的 test 属性中的 XPath 表达式声明的。

 

Schematron 断言语言提供了一种机制来对使用 XPath 表达式的 XML 文档的有效性进行断言。在一个 Schematron 文档中有 6 个常用元素:schema、ns、pattern、rule、assert 和 report。Schematron 断言语言所使用的元素的命名空间 URI 是 http://www.ascc.net/xml/schematron

<schema>元素:架构的文档元素。其子元素包括 title 元素(包含架构的可读名称)、ns 元素(用于指定架构中的 XPath 表达式所使用的 namespace<->prefix 绑定)、phase 元素(描述应该一起执行的模式组)、pattern 元素(包含要根据其验证文档的规则组)以及 diagnostics 元素(用于在文档断言失败时提供较细粒度的错误消息)。schema 元素还包含以下属性:id、version、schemaVersion、fpi、defaultPhase 和 icon。下面是 schema 元素的一个示例:

<schema xmlns="http://www.ascc.net/xml/schematron"  schemaVersion="1.01" >
  <title>A Schema for Books</title>
  <ns prefix="bk" uri="http://www.example.com/books" />
  <pattern id="authorTests">
    <rule context="bk:book">
      <assert test="count(bk:author)!= 0">
   A book must have at least one author
      </assert>
    </rule>
  </pattern>
  <pattern id="onLoanTests">
    <rule context="bk:book">
      <report test="@on-loan and not(@return-date)">
   Every book that is on loan must have a return date
      </report>
    </rule>
  </pattern>
</schema>
<ns>元素:它用于指定 XPath 表达式在 pattern、rule 和 assert 元素中使用的 prefix<->namespace 绑定。它有一个必需的 prefix 和 uri 属性,它们用于定义命名空间前缀和与该前缀绑定的命名空间名称。下面是 ns 元素的一个示例。

<ns prefix="bk" uri="http://www.example.com/books" />
<pattern>元素:pattern 包含一个 rule 元素列表。pattern 元素还包含以下属性:id、name、see 和 icon。模式的主要用途是将类似的断言分组到一起,这样我们就可以创建阶段 — 在其中为验证管道的不同阶段执行不同模式的组合。下面是 pattern 元素的一个示例:

<pattern id="authorTests"
 see="http://www.example.com/books/guidelines.html"
 name="Test for non-zero number of authors">
    <rule context="bk:book">
      <assert test="count(bk:author)!= 0">
         A book must have at least one author
      </assert>
    </rule>
  </pattern>
<rule>元素:assert 和 report 元素包含在 rule 元素中。rule 元素有一个包含 XPath 表达式的 context 属性。来自匹配 context 属性所指定的 XPath 表达式的输入文档的所有节点,随后会根据 rule 中的每个 assert 和 report 元素来测试,以检查它们是否满足断言。规则还有一个用于提供宏包含机制的 abstract 属性。当属性值为 true 时,该规则的内容可以包含在其他 rule 元素中。rule 元素可以具有一个或多个引用抽象 rule 的 extends 元素。在验证期间,rule 的 extends 元素由目标抽象 rule 的内容所替换。rule 还可以包含一个 key 元素,该元素提供一个在文档的部分之间定义交叉引用的机制,它类似于 XSLT 中的 key 元素。key 元素具有一个 name 属性,用于标识 key 和包含要与其匹配的 XPath 表达式的 path 属性。下面是 rule 元素的一个示例:

<rule context="bk:book" role="authorCountRule">
      <assert test="count(bk:author)!= 0">
       A book must have at least one author
      </assert>
    </rule>
<assert>元素:assert 元素提供的机制用于测试关于元素内容模型的语句(即断言)是否为真。这个元素的 test 属性包含一个 XPath 表达式。如果使用 XPath boolean() 函数将 XPath 查询结果转换为布尔值之后结果为 false,则会出现一个验证错误。在这种情况下,assert 元素的内容将作为错误消息发出。对于错误消息,assert 元素允许混合内容(文本与元素交错)。大多数允许作为子元素的元素都是用于可视化布局的,而且是从 HTML 借用的,如 p、emph 和 dir。最后允许的子元素是 name 元素。当错误消息发出时,name 元素将被 context 元素的名称所替换。为了使架构作者能够重复使用错误消息,assert 元素可以包含一个 diagnostics 属性,这个属性可以引用架构的 diagnostics 元素中的一个或多个 diagnostic 元素。这样,如果出现验证错误,assert 元素的内容和所引用的 diagnostic 元素的内容都会被发出。assert 元素还具有以下其他属性:id、role、subject 和 icon。下面是 assert 元素的一个示例:

<assert test="count(bk:author)!= 0">
       A book must have at least one author
</assert>
<report>元素:除了一个至关重要的差异外,这个 report 元素与 assert 元素完全相同。如果使用 XPath boolean() 函数将 test 属性中的 XPath 查询结果转换为布尔值之后结果为 true,则会出现一个验证错误。下面是 report 元素的一个示例:

<report test="@on-loan and not(@return-date)">
  Every book that is on loan must have a return date
 </report>

 

转载于:https://www.cnblogs.com/lorna/archive/2012/08/14/2638314.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值