XSD可用于定义内联样式表吗? (强制节点使用特定的命名空间。)

时间:2013-02-01 00:49:25

标签: xml xslt xsd

我正在尝试构建一个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命名空间。是否有一个equivelant语法,允许我指定这个限制?符合标准的XML看起来像这样:

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

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

1 个答案:

答案 0 :(得分: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"/>

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

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