首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XML名称空间、架构验证(XSD)和XSLT

XML名称空间、架构验证(XSD)和XSLT
EN

Stack Overflow用户
提问于 2015-03-07 20:48:11
回答 2查看 2.6K关注 0票数 2

我有一个XML文件,其结构如下:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="studentsStylesheet.xsl"?>
<students xmlns="urn:students">
  <student>
    ...
  </student>
</students>

XSD模式:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="urn:students"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="students">
    ...        
  </xs:element>
</xs:schema>

以及一个用于可视化(studentsStylesheet.xsl)的XSL文件:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      ...
    </html>
  </xsl:template>
</xsl:stylesheet>

目前,我正在学习关于XML的短期课程,任务是在XML文件中构造给定的XSD模式和一些示例记录,然后使用XSLT将内容可视化为HTML。其中一项任务说明,我需要使用"urn:students“作为该结构的默认命名空间。然而,当我这样做的时候,我不会在最后的可视化中接收数据。当我从XML文件中删除“xmlns=”urn:students“时,一切正常。我已经阅读了一些关于XML名称空间的材料和教程,但我只是更加困惑。它应该与普通的编程语言相同,但同时又有很大的不同。我没有找到关于以下几点的明确解释:

  1. 如何将XML链接到架构?我是否需要将文件链接到架构,反之亦然?在我读过的每一篇文章/教程中,都有一种不同的方法来实现这一点,但没有解释原因。
  2. 在这种情况下,我应该在XML和Schema中包含哪些名称空间。

我也不明白XML文件中的“xmlns=”urn:students“定义”到底有什么问题。这些元素不是在具有相同命名空间的架构中正确定义的吗?为什么XSL不能提取数据?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-07 21:34:29

听起来您的XML和XSD (可能)还行,问题在于您的XSLT。

XPath 1.0不允许默认命名空间。任何没有前缀的XPath段都被视为引用了"null命名空间“。

为了引用XPaths中的命名空间,需要为其指定一个前缀(在XSLT中):

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:st="urn:students">

然后在XPaths中使用它:

代码语言:javascript
复制
<xsl:value-of="st:Students/st:Student" />
票数 2
EN

Stack Overflow用户

发布于 2015-03-08 02:50:52

回答你的问题1:

如何将XML链接到架构?我是否需要将文件链接到架构,反之亦然?在我读过的每一篇文章/教程中,都有一种不同的方法来实现这一点,但没有解释原因。

不需要从文档指向其XSD模式,但在某些环境和情况下,这样做很方便。大多数模式的目的是无限期地处理大量文档,因此在通常情况下,从模式指向文档将非常麻烦;出于这个原因,可能没有从模式文档指向实例文档的标准方法。

你的选择包括:

在验证时命名架构

如果要根据特定模式验证XML文档,最可靠的方法是在验证器的调用中指定XML文档的URI和所需模式文档的URI。大多数XSD验证器应该有一个允许您这样做的调用接口。(如果您使用的验证器没有,我的建议是获得一个新的验证器。但你应该自己做决定。)

这种方法不需要XML文档中的任何内容来指向模式文档;它是验证从不受信任的源接收的文档的唯一可靠方法(因为如果您不信任它们来提供有效的文档,那么您可能也不信任它们指向正确或一致同意的模式文档)。

使用xsi:schemaLocation定位

如果您希望指向XML文档中的模式,作为记录文档含义的一种方式,或者在调用验证器时保存自己的类型,则XSD规范定义了一种方法:在XML文档中使用xsi:schemaLocation属性。属性值包含一系列空间分隔的URI对:名称空间名称,然后是该命名空间的架构文档的URI。因此,XML文档的开头可能如下所示:

代码语言:javascript
复制
<students 
  xmlns="urn:students"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsl:schemaLocation="urn:students
    http://yoursite.example.com/2015/students.xsd"
> ...

如果在调用验证器时不指定任何模式文档,许多XSD验证程序将默认读取xsi:schemaLocation属性中指定的模式文档。

使用xml模型处理指令。

W3C已经定义了一种类似于xml-stylesheet处理指令的泛型模式链接机制;如果您愿意,可以使用它代替xsi:schemaLocation属性,也可以使用它。然后,XML的开头可能如下所示:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" 
  href="studentsStylesheet.xsl"?>
<?xml-model type="application/xml"
  schematypens="http://www.w3.org/2001/XMLSchema"
  href="http://www.w3.org/2001/XMLSchema" 
  title="My excellent XSD Schema"?>
<students xmlns="urn:students"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsl:schemaLocation="urn:students
    http://yoursite.example.com/2015/students.xsd"
>

类型伪属性通常可以省略(验证器将发现模式的MIME类型,当它取消URI时),并且模式类型也可能是不可忽略的(验证器在得到模式时会看到它是什么样的模式);可以使用它的软件使用这个标题伪属性。

如果在验证器的调用中没有指定模式文档,那么可能会有XSD验证器来读取和理解xml模型处理指令,并查询指定的模式文档;我不知道有任何间接的情况,但我最近没有研究过这个问题。当然,如果链接的目的是记录XML实例的概念框架,这并不重要:人类读者可以使用处理指令来查找您想要对其有效的模式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28919810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档