当前位置: 首页 > 知识库问答 >
问题:

XML命名空间、模式验证(XSD)和XSLT

彭海阳
2023-03-14

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

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="studentsStylesheet.xsl"?>
<students xmlns="urn:students">
  <student>
    ...
  </student>
</students>

XSD模式:

<?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>

和可视化的XSL文件(学生tylesheet.xsl):

<?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将内容可视化为超文本标记语言。其中一项任务指出,我需要使用“urn:学生”作为结构的默认命名空间。然而,当我这样做的时候,我不会在最终的可视化中收到数据。当我从XML文件中删除“xmlns=”urn:学生”时,一切都很好。我读过一些关于XML命名空间的材料和教程,但我只是更加困惑了。它应该和正常编程语言中的一样,但在同一时间却大不相同。我没有找到关于以下事情的明确解释:

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

我也无法理解XML文件中“xmlns=“urn:students”定义的确切问题是什么。在具有相同名称空间的模式中,元素的定义是否正确?为什么XSL不能提取数据

共有2个答案

昝宜
2023-03-14

要回答你的问题1:

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

不需要从文档指向它的XSD模式,但是在某些环境和情况下这样做很方便。大多数模式旨在处理无限数量的文档,因此在通常情况下,从模式指向文档会非常麻烦;也许正因为如此,没有从模式文档指向实例文档的标准方法。

您的选择包括:

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

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

如果您想从XML文档中指向一个模式,作为记录文档含义的一种方式,或者在调用验证器时保存自己键入的内容,XSD规范定义了一种方法:在XML文档中使用xsi:schemaLocation属性。属性值包含一系列以空格分隔的URI对:名称空间名称,然后是该名称空间的架构文档的URI。因此,XML文档的开头可能是这样的:

<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: schemaPlace属性中命名的模式文档。

W3C定义了一个通用的模式链接机制,类似于xml-style lesheet处理指令;如果您愿意,您可以使用它来代替或补充xsi: schemaPlace属性。然后,您的XML的开头可能看起来像:

<?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"
>

类型伪属性通常可以省略(当验证器取消引用URI时,它将找出模式的MIME类型),模式笔也可以省略(验证器将看到,当它获得模式时,它是什么样的模式);标题伪属性在那里供可以使用它的软件使用。

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

吴康平
2023-03-14

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

XPath 1.0不允许使用默认名称空间。任何没有前缀的XPath段都被视为引用“空名称空间”。

为了在XPaths中引用命名空间,需要为其分配前缀(在XSLT中):

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:st="urn:students">

然后在你的XPath中使用它:

<xsl:value-of="st:Students/st:Student" />
 类似资料:
  • 我无法使用下面的XSD验证XML, XSD数据 我在用XML验证这个XSD时遇到以下错误, cvc复合型。2.4.答:发现以元素“standardHeader”开头的内容无效。应为“{standardHeader}”之一。 如何提供此标签:

  • 我在验证xml和xsd时遇到问题。我从xsd模式中得到这个错误。 src解决方案。4.2:解析组件“urn:id”时出错。检测到“urn:id”位于命名空间“urn:schemas microsoft com:xml-diffgram-v1”中,但此命名空间中的组件无法从架构文档中引用virtual://server/schema.xsd。如果名称空间不正确,可能需要更改“urn:id”的前缀。如

  • 问题内容: 我想针对XSD架构验证XML文件。XML文件根元素没有任何名称空间或xsi详细信息。它没有属性,只是。 我已经尝试从http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html尝试以下代码,但运气不佳 xml可以使用包含的名称空间标头等(通过xmlspy添加)很好地验证,但是我想可以不用手动编辑源文件就可以声明

  • 在这一节中,我们将探索JavaScript中关于命名空间的模式。命名空间可被看作位于一个唯一标识符下的代码单元的逻辑组合。标识符可以被很多命名空间引用,每一个命名空间本身可以包含一个分支的嵌套命名空间(或子命名空间)。 在应用开发过程中,出于很多原因,我们都要使用命名空间。在JavaScript中,它们帮助我们避免在全局空间中于其他对象或者变量出现冲突。它们对于在代码库中组织功能块也非常有用,这样

  • 问题内容: 我有一个XML文件,并且有一个XML模式。我想针对该架构验证文件,并检查其是否符合该架构。我正在使用python,但是如果python中没有这样有用的库,则可以使用任何语言。 我在这里最好的选择是什么?我会担心如何快速启动和运行它。 问题答案: 绝对可以。 使用预定义的架构定义,加载文件并捕获任何XML架构错误: 关于编码的注意事项 如果模式文件包含带有编码(例如)的xml标记,则上面

  • Spring Security中主要的提高验证服务的接口是AuthenticationManager,这通常是一个Spring Security的ProviderManager 类的实例。如果你以前用过框架你可能已经熟悉了。如果不是后面的技术预览章节会讲到。这个bean是通过authentication-manager命名空间来注册。你不能使用自定义的AuthenticationManager如果