级别: 中级 Uche Ogbuji, 合作伙伴, Zepheira, LLC
2009 年 1 月 12 日 schemata 中的内容(人、地点和事件)必然与人们描述它们的方式有关,而这是将技术和业务结合在一起的关键。XML 模式设计者可以完成的最重要的一项工作就是清晰地表达这种关系。SKOS 是以 DITA 组件著称的一种语言,非常适合表达这种关系。通过本文了解如何通过 SKOS 定义丰富模式定义。
为了解释 XML schemata 和实例中的结构的含义,这个 Thinking XML 专栏的主要主题一直关注语义透明性。我已经介绍了实现语义透明性的自下而上(bottom-up)方法,使用这种方法可以以独立于文档和 schemata 的方式单独定义术语和概念(实际指数据字典),然后就可以广泛地应用这些内容。行业已经为自下而上语义透明性构建了大量计划,这些计划中有一部分具有更好的生命力。在本专栏中,我讨论了 ISO Basic Semantics Register(BSR)、RosettaNet Dictionaries、ebXML Core Components、Universal Data Element Framework(UDEF)、财务服务方面的 ISO 15022 等内容。但是大型的行业计划不提供在大部分 XML 应用程序中驱动模式开发的术语。更常见的情况是您需要定义自己的专门化数据字典。
 |
常用缩写词
- DITA:Darwin 信息分类体系结构
- URI:统一资源标识符
- W3C:万维网联盟
- XML:可扩展标记语言
- XSL:可扩展样式表语言
- XSLT:XSL 转换
|
|
架构师越来越意识到仅仅提供数据字典并不足以支持日益丰富的信息集成。在 XML 文档中,需要通过各种相互关系指代人、地点和事件,从一般的关系到更加具体的关系、作用和种类、同义词和反义词。您需要描述与地理位置、关键的时间和日期、策略、业务规则的联系。有时需要将自己的专门化的信息空间扩展到更广阔的行业约定。这些细节使 Semantic Web 技术非常适合支持 XML 开发,因此有必要开始了解最普通的、最简单的语义 Web 技术。Simple Knowledge Organization System (SKOS) 就是这样一种技术,目前正处于工作草案流程中的最后请求阶段,但是已经得到了充分理解、实现和讨论。不幸的是,SKOS 在其最后设计阶段损失了一些简单性,因为其委员会将其绑定到更加复杂的 Web Ontology Language(OWL),如果忽略其中一些比较花俏的装饰,SKOS 仍然非常有用。它至少为关联术语的基本含义关系提供了文字关系,而这是丰富 XML schemata 的良好开头。
从概念到表达
在开发过程中,最好及早地捕获概念。在分析新应用程序或集成现有应用程序期间,您应该记录下主要的概念,尽可能多地保留最初的概念。资源描述框架(Resource Description Framework,RDF)的 Turtle 语法非常有用,它可以使用适合非技术用户查看的格式捕获这些概念。开发人员和业务兴趣之间的紧密结合对于提高使用 XML 组织信息价值十分关键。在本文中,我将使用来自滑板制造商 Fluffy Boards 的一个场景,开发一种格式,使用它捕获称为 Cumulus 的新款滑板的销售信息。清单 1 展示了有关概念的 SKOS 定义的一部分,其中使用了 Turtle 语法。
清单 1. 使用 Turtle 格式表示的滑板销售信息中关键概念的 SKOS 定义
_cnnew1@prefix skos: <http://www.w3.org/2004/02/skos/core#>.
@prefix f: <http://www.fluffyboards.com/vocabulary#>.
f:product
a skos:Concept;
skos:prefLabel "product";
skos:altLabel "merchandise item";
skos:definition "Item developed for sale by Fluffy Boards.".
f:snowboard
a skos:Concept;
skos:prefLabel "snowboard";
skos:altLabel "deck";
skos:definition "Deck to be mounted with bindings for riding on snow.";
skos:broader f:product.
f:endorsement
a skos:Concept;
skos:prefLabel "endorsement";
skos:altLabel "formal thumbs-up";
skos:definition "Formal statement of approval of the product.";
skos:broader f:review.
f:review
a skos:Concept;
skos:prefLabel "review";
skos:altLabel "product opinion";
skos:definition "Statement of opinion of a product.".
f:customer
a skos:Concept;
skos:prefLabel "customer";
skos:definition "Person or group engaged by Fluffy Boards in the purchase process.".
|
可以从 参考资料 获得有关 SKOS 的全部介绍,但是这里将简单地介绍一下,前两行是 Turtle 版本的名称空间声明。f 名称空间专属于 Fluffy Boards。下一个代码块定义了概念 f:product,指定了需要的标签和可选的选项。skos:definition 是一个简洁但精确的概念描述。skos:broader 属性是一种组织相关概念的方法。“Person” 比 “boy” 的含义更广,而 “boy” 是比 “person” 范围窄的概念。您可以使用 schemata 对 XML 版本的 SKOS 词汇表进行一般性处理。而一旦使用 Turtle 版本后,可以使用工具自动将其转换到 RDF/XML(反之亦然)。清单 2 是 清单 1 的 XML 形式。
清单 2. 使用 RDF/XML 格式表示的滑板销售信息中关键概念的 SKOS 定义
<?xml version="1.0"?>
<rdf:RDF xmlns:f="http://www.fluffyboards.com/vocabulary#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:skos="http://www.w3.org/2004/02/skos/core#">
<skos:Concept rdf:about="http://www.fluffyboards.com/vocabulary#snowboard">
<skos:prefLabel>snowboard</skos:prefLabel>
<skos:altLabel>deck</skos:altLabel>
<skos:definition>Deck to be mounted with bindings for riding on snow.
</skos:definition>
<skos:broader>
<skos:Concept rdf:about="http://www.fluffyboards.com/vocabulary#product">
<skos:prefLabel>product</skos:prefLabel>
<skos:altLabel>merchandise item</skos:altLabel>
<skos:definition>Item developed for sale by Fluffy Boards.</skos:definition>
</skos:Concept>
</skos:broader>
</skos:Concept>
<skos:Concept rdf:about="http://www.fluffyboards.com/vocabulary#endorsement">
<skos:prefLabel>endorsement</skos:prefLabel>
<skos:altLabel>formal thumbs-up</skos:altLabel>
<skos:definition>Formal statement of approval of the product.</skos:definition>
<skos:broader>
<skos:Concept rdf:about="http://www.fluffyboards.com/vocabulary#review">
<skos:prefLabel>review</skos:prefLabel>
<skos:altLabel>product opinion</skos:altLabel>
<skos:definition>Statement of opinion of a product.</skos:definition>
</skos:Concept>
</skos:broader>
</skos:Concept>
<skos:Concept rdf:about="http://www.fluffyboards.com/vocabulary#customer">
<skos:prefLabel>customer</skos:prefLabel>
<skos:definition>Person or group engaged by Fluffy Boards in the purchase process.
</skos:definition>
</skos:Concept>
</rdf:RDF>
|
转换为模式
使用 SKOS 这类半正式语言表达了概念基础后,需要依靠自己的良好 XML 设计和创造性来将概念融入到模式中。假设 Fluffy Boards 销售部门使用 XML 存储每个滑板的评论。他们可能使用如清单 3 所示的 W3C XML Schema (WXS) 定义。
清单 3. W3C XML Schema 定义
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://www.fluffyboards.com/marketing/"
xmlns:f="http://www.fluffyboards.com/vocabulary#"
xmlns:m="http://www.fluffyboards.com/marketing/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:skos="http://www.w3.org/2004/02/skos/core#">
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="http://www.w3.org/2000/10/xml.xsd"/>
<xs:element name="snowboard">
<xs:annotation>
<xs:appinfo>
<skos:Concept rdf:about="http://www.fluffyboards.com/vocabulary#snowboard">
<skos:prefLabel>snowboard</skos:prefLabel>
<skos:altLabel>deck</skos:altLabel>
<skos:broader rdf:resource="http://www.fluffyboards.com/vocabulary#product"/>
</skos:Concept>
</xs:appinfo>
<!-- from skos:Concept/skos:definition -->
<xs:documentation>Deck to be mounted with bindings for riding on snow.
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="name"/>
<xs:element ref="m:description"/>
<xs:choice maxOccurs="unbounded">
<xs:element ref="m:review"/>
</xs:choice>
</xs:sequence>
<xs:attribute ref="xml:base"/>
<xs:attribute name="id" use="required" type="xs:anyURI"/>
</xs:complexType>
</xs:element>
<xs:element name="review">
<xs:annotation>
<xs:appinfo>
<skos:Concept rdf:about="http://www.fluffyboards.com/vocabulary#review">
<skos:prefLabel>review</skos:prefLabel>
<skos:altLabel>product opinion</skos:altLabel>
</skos:Concept>
</xs:appinfo>
<xs:documentation>Statement of opinion of a product.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element ref="m:source"/>
<xs:element name="content" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="source">
<xs:annotation>
<xs:appinfo>
<skos:Concept rdf:about="http://www.fluffyboards.com/vocabulary#customer">
<skos:prefLabel>customer</skos:prefLabel>
</skos:Concept>
</xs:appinfo>
<xs:documentation>Person or group engaged by Fluffy Boards in the purchase process
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="description">
<xs:complexType>
<xs:attribute name="purpose" use="required" type="xs:anyURI"/>
</xs:complexType>
</xs:element>
</xs:schema>
|
直接来自 SKOS 的结构使用粗体表示。注意,我导入了 xml.xsd,这样就可以使用 xml:base 属性。除了 SKOS 注释外,XML 模式设计中的另一个有用语义 Web 实践是对 ID 使用 URI。XML Base 允许您清晰地缩写这类 URI。通过在模式注释中表达,snowboard 元素被附加到同名的抽象概念中。我还将 SKOS 概念描述提供给 xs:documentation 元素,这有助于顺利集成支持 WXS 的工具。注意,SKOS 概念和 XML 词汇表中的结构之间并不是始终存在一对一的关系。一些模式元素没有附加的概念,而一些概念并没有出现在模式中。review 元素附加到同名的概念中,但是它的 source 子元素附加到 customer 概念,通过这种方式可以获得一种隐含的规则,即评论来源就是客户。我还建议在概念库中明确地表达这类规则,但是从这个示例可以看到光是从概念附加到 scchemata 就非常具有表达性。
示例实例
清单 4 是 清单 3 中所示模式的示例实例。
清单 4. 基于清单 3 模式的示例实例
<?xml version="1.0" encoding="UTF-8"?>
<snowboard xmlns="http://www.fluffyboards.com/marketing/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.fluffyboards.com/marketing/ file:listing3.xsd"
xml:base="http://www.fluffyboards.com/marketing/"
id="boards/cumulus">
<name>Cumulus</name>
<description purpose="unsolicited-blurb"/>
<review>
<source>Uche Ogbuji</source>
<content>The Cumulus floats in powder like a dream. My favorite snowboard.
</content>
</review>
</snowboard>
|
自动连接
上一小节 介绍的方法有一个问题,就是概念信息在 schemata 中是重复的,因此对这些重复的概念进行更新时会出现错误。更好的方法是将模式与概念信息链接在一起。您可以在需要时自动合并这些信息。清单 5 对 清单 3 进行了一些修改,将其链接到 SKOS,而不是复制结构。
清单 5. 链接到 SKOS 文档的 WXS
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://www.fluffyboards.com/marketing/"
xmlns:f="http://www.fluffyboards.com/vocabulary#"
xmlns:m="http://www.fluffyboards.com/marketing/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:skos="http://www.w3.org/2004/02/skos/core#">
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="http://www.w3.org/2000/10/xml.xsd"/>
<xs:annotation>
<xs:appinfo>
<owl:imports rdf:resource="fluffy-marketing.skos"/>
</xs:appinfo>
</xs:annotation>
<xs:element name="snowboard">
<xs:annotation>
<xs:appinfo>
<skos:Concept rdf:about="http://www.fluffyboards.com/vocabulary#snowboard"/>
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="name"/>
<xs:element ref="m:description"/>
<xs:choice maxOccurs="unbounded">
<xs:element ref="m:review"/>
</xs:choice>
</xs:sequence>
<xs:attribute ref="xml:base"/>
<xs:attribute name="id" use="required" type="xs:anyURI"/>
</xs:complexType>
</xs:element>
<xs:element name="review">
<xs:annotation>
<xs:appinfo>
<skos:Concept rdf:about="http://www.fluffyboards.com/vocabulary#review"/>
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element ref="m:source"/>
<xs:element name="content" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="source">
<xs:annotation>
<xs:appinfo>
<skos:Concept rdf:about="http://www.fluffyboards.com/vocabulary#customer"/>
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="description">
<xs:complexType>
<xs:attribute name="purpose" use="required" type="xs:anyURI"/>
</xs:complexType>
</xs:element>
</xs:schema>
|
注意,我临时使用 owl:imports 规范化将 SKOS 概念合并到模式。为了解释传输这些链接的简单性,以及从 清单 3 的简单形式自动生成 清单 5 中更完善形式的简单性,我编写了一些 XSLT。清单 6 的代码并不健壮(并不能处理复杂的 RDF 结构,甚至不能处理 rdf:ID 和 xml:base 这类简单内容),并且如果在 XML 模式设计中使用了大量 SKOS,您需要具有一些合适的 RDF 工具。但是它解释了这个想法并且处理了本文的示例。
清单 6. 使用 XSLT 扩展 WXS 中的简单 SKOS 引用
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:skos="http://www.w3.org/2004/02/skos/core#"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xsl:variable name="skosfile"
select="document(/xs:schema/xs:annotation/xs:appinfo/owl:imports/@rdf:resource)"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="skos:Concept">
<xsl:variable name="uri" select="@rdf:about"/>
<xsl:copy>
<xsl:apply-templates select="$skosfile//skos:Concept[@rdf:about=$uri]/*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="xs:annotation">
<xsl:variable name="concept" select="xs:appinfo/skos:Concept/@rdf:about"/>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
<xsl:if test="$concept">
<xs:documentation>
<xsl:value-of
select="$skosfile//skos:Concept[@rdf:about=$concept]/skos:definition"/>
</xs:documentation>
</xsl:if>
</xsl:template>
<xsl:template match="skos:definition"/>
</xsl:stylesheet>
|

 |

|
结束语
与 WXS 相比,将 SKOS 概念附加到更丰富的模式语言(比如 RELAX NG 和 Schematron,我比较喜欢这两种语言)的结构中更加简单。由于 SKOS 具有独立的名称空间,因此必要时可以将 SKOS 元素内联起来。无论使用何种模式语言,都不会得到全能的方法,因此不可能一下子使 XML 文档对所有人和应用程序透明。您实际得到的是一个我在本专栏称为 anchor 的东西 — 它为您提供线索,为集成提供指导并改进数据质量。将模式注释与各种信息共享工具(比如 wiki)结合在一起,使所有具有不同技能级别的人都可以展开合作并作出贡献。SKOS 就是一种表达这类交换技术的良好语言。在本文中,您了解到将领域概念合并到 XML 模式定义中是多么简单!
参考资料 学习
获得产品和技术
讨论
关于作者  | 
|  | Uche Ogbuji 是 Zepheira, LLC 的合伙人,这家公司专门提供下一代 Web 技术解决方案。Ogbuji 是 4Suite 的首席开发人员,这是一种用于 XML、RDF 和知识管理应用程序的开放源代码平台;也是 Versa RDF 查询语言的首席开发人员。他是一位出生在尼日利亚的计算机工程师和技术作家,目前定居在科罗拉多的博尔德。可以通过他的 Weblog Copia 进一步了解 Ogbuji 先生。 |
对本文的评价
|