0

论坛成员,

根据我对 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) 中。代码中的最后一行表示正在使用的模式(xsd 文件)。但是,似乎缺少任何显示正在使用的样式表的代码。

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

如果这是不可能的,有人可以为我澄清为什么在上面显示的代码第 1 行的 XML 声明之后缺少样式表声明?

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

4

2 回答 2

0

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

因此,您关于样式表必须与模式捆绑在一起的结论也是不正确的。

事实上,从源文档中引用模式也是有问题的做法。如果你想验证文档,那意味着你不信任它,如果你不信任它,为什么要信任它来引用正确的模式?

于 2013-09-09T17:08:03.883 回答
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 引擎都支持“import-schema”,所以你的情况可能会有所不同。

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

于 2020-06-09T14:03:05.390 回答