我正在尝试构建一个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”的节点,并使用他们选择的任何命名空间。
答案 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"/>
如果您想允许顶级元素为stylesheet
或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>