可以将StyleSheet和Schema合并为一个XSD文件吗?

时间:2013-09-09 16:10:10

标签: xml xslt schema declaration

论坛成员,

根据我对XML的了解,Schema定义了结构规则,StyleSheet驱动了PDF输出格式的完成方式。但是,以下问题是否有正确或错误的答案,“可以将架构和样式表合并到一个XSD文件中吗?”

我问这个的原因是因为下面的代码:

<?xml version="1.0" encoding="UTF-16"?><!DOCTYPE dmodule[ <!ENTITY % ISOEntities PUBLIC "ISO 8879-1986//ENTITIES ISO Character Entities 20030531//EN//XML" "http://www.s1000d.org/S1000D_4-0-1/ent/ISOEntities" > %ISOEntities; ]><dmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://www.purl.org/dc/elements/1.1/" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:noNamespaceSchemaLocation="http://www.s1000d.org/S1000D_4-0-1/xml_schema_master/procedSchema.xsd"

上面显示的XML代码来自符合S1000 D标准的数据模块。它位于所谓的公共源数据库(CSDB)中。代码中的最后一行表示正在使用的Schema(xsd文件)。但是,似乎缺少的是显示正在使用样式表的任何代码。

因此,我现在猜测XSD文件包含单个XSD文件中的Schema和Stylesheet。这可能吗?在XML世界中是否允许两个都在一个文件中?

如果无法做到这一点,有人可以向我澄清为什么在上面显示的代码的第1行上的XML声明后缺少StyleSheet声明?

我是否认为在数据模块本身中嵌入StyleSheet声明是必需的XML规则?或者CSDB可以在外部控制StyleSheet声明吗?我的想法一直是所有样式表声明都需要硬编码到数据模块本身。否则,Parser不知道要使用哪种样式表。任何建议将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分:0)

您认为样式表需要从源文档中引用的假设非常不正确。这意味着源文档只能使用一个样式表进行处理,这完全会破坏目的!通常,通过指定源文档和样式表来调用转换。可以从源文档中引用样式表,但这绝不是不变的做法。

因此,您的结论是样式表必须与架构捆绑在一起也是错误的。

事实上,从源文档引用模式也是一种有点可疑的做法。如果您想验证文档,这意味着您不信任它,如果您不信任它,为什么您应该相信它引用正确的模式?

答案 1 :(得分:0)

简单的答案是,可以在同一个文件中定义XSD模式和XSL样式表,因此:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                 version="2.0">

  <xsl:output method="xml" indent="yes" />

  <xsl:import-schema>
    <xs:schema>
      <xs:element name="items">
        <xs:complexType>      
          <xs:sequence>
            <xs:element name="item" maxOccurs="unbounded">
              <xs:complexType>
               <xs:sequence>
                 <xs:element name="title" type="xs:string"/>
                 <xs:element name="note" type="xs:string" minOccurs="0"/>
                 <xs:element name="quantity" type="xs:positiveInteger"/>
                 <xs:element name="price" type="xs:decimal"/>
               </xs:sequence>
               <xs:attribute name="id" type="xs:string" use="required"/>
               <xs:attribute name="type" type="xs:string" use="optional"/>
              </xs:complexType>
            </xs:element>
          </xs:sequence>      
        </xs:complexType>
      </xs:element>
    </xs:schema>
  </xsl:import-schema>

  <xsl:template match="/PurchaseOrder">
    <items xsl:validation="strict">
      <xsl:copy-of select="item[price < 15]" />
    </items>
  </xsl:template>

</xsl:stylesheet>

但是并非所有XSL引擎都支持“导入模式”,因此您的里程可能会有所不同。

稍长一点的答案是,模式可以在转换之前验证输入,或者在转换之后验证输出。您的实现将取决于您感兴趣的操作。 在这里可以找到更多信息:https://www.ibm.com/developerworks/library/x-schemaxslt/index.html