1

我正在尝试构建一个 XSD,它将特定节点限制为“内联”样式表。

它可能看起来像这样:

<complexType name="InlineXslt">
  <sequence>
    <any minOccurs="1" maxOccurs="1" FORCE_NAMESPACE="http://www.w3.org/1999/XSL/Transform" />
  </sequence>
</complexType>

也许...

<complexType name="InlineXslt">
  <sequence>
    <element name="stylesheet" minOccurs="1" maxOccurs="1" FORCE_NAMESPACE="http://www.w3.org/1999/XSL/Transform" />
  </sequence>
</complexType>

当然没有 FORCE_NAMESPACE 属性,但想法是强制节点使用 XSL 命名空间。是否有等效的语法可以让我指定此限制?符合标准的 XML 如下所示:

<InlineXslt>
  <stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform">
    <... etc ...>
  </stylesheet>
</InlineXslt>

如果我在第一个 XSD 示例中省略(不存在的)“FORCE_NAMESPACE”属性,它确实有效,但不强制执行。由于使用了“any”元素,用户可以在其中放置任何他们想要的东西,包括一个未命名为“stylesheet”的节点并使用他们选择的任何命名空间。

4

1 回答 1

1

简短的回答:

FORCE_NAMESPACE您想要的属性xs:any存在;它被称为namespace。(它可能与您的 FORCE_NAMESPACE 不同,它允许多个命名空间名称。)FORCE_NAMESPACE您想要的属性xs:element不存在,因为它不是必需的;您正在寻找的功能是使用ref属性和限定名称来实现的。

更长的答案:

如果您希望类型为 InlineXslt 的元素包含 xslt:stylesheet 元素,实现它的最简单方法是这样说:

<xs:complexType name="InlineXslt">
  <xs:sequence>
    <xs:element ref="xsl:stylesheet" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
  </xs:sequence>
</xs:complexType>

这将要求您的架构文档导入 XSLT 命名空间,因此在架构文档的顶部您将拥有类似以下内容:

<xs:import namespace="http://www.w3.org/1999/XSL/Transform"/>

如果您想允许顶级元素为stylesheetor transform,请编写一个选项:

<xs:complexType name="InlineXslt2">
  <xs:choice 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xs:element ref="xsl:stylesheet"/>
    <xs:element ref="xsl:transform"/>
  </xs:choice>
</xs:complexType>

如果您想允许任意 XSLT 元素(在您的特定情况下听起来像是一场语义噩梦,但作为示例),请使用通配符指定接受 XSLT 命名空间中的任何元素:

<xs:complexType name="InlineXslt3">
  <xs:choice>
    <xs:any namespace="http://www.w3.org/1999/XSL/Transform"
     maxOccurs="unbounded"/>
  </xs:choice>
</xs:complexType>
于 2013-02-01T01:36:20.790 回答