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

トップレベルの要素をまたはのいずれ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>
于 2013-02-01T01:36:20.790 に答える