0

リテラルの結果要素を持つschema-element()として使用した場合の動作を理解しようとしています。SequenceTypeこれは私のスタイルシートです

<xsl:stylesheet
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs">

  <xsl:import-schema>
    <xs:schema>
      <xs:element name="foo">
        <xs:complexType>
          <xs:attribute name="bar"/>
        </xs:complexType>
      </xs:element>
    </xs:schema>
  </xsl:import-schema>

  <xsl:variable name="test" as="schema-element(foo)">
    <foo bar="baz"/>
  </xsl:variable>

  <xsl:template match="/">
    <xsl:sequence select="$test"/>
  </xsl:template>

</xsl:stylesheet>

Saxon-EE 9.4.0.4 (Oxygen 14.1) で次のコンパイル エラーが発生するRequired item type of value of variable $test is schema-element(foo); supplied value has item type element(foo, {http://www.w3.org/2001/XMLSchema}untyped)

XSLT 2.0 および XPath 2.0 Programmer's Referenceによると

構文 «schema-element(N)» … が SequenceType で使用される場合、N はグローバル要素の名前でなければなりません… インポートされたスキーマの宣言。

同じソースの別の場所

«as="schema-element(EVENT)"» は、[a parameter] が EVENT または EVENT の置換グループ内の要素であると検証された要素ノードでなければならないことを示します。

インポートされたスキーマによって要素<foo bar="baz"/>として検証する必要があるようです。役立つように思えますが、インポートしたスキーマに名前付きの複合型がある場合に限ります。私は何が欠けているか、間違っていますか?foo@xsl:type

4

2 に答える 2

1

複雑なことの 1 つは、xsl:variable にリテラル コンテンツがある場合、変数がドキュメント ノードにバインドされることです (もちろん、後でさまざまな方法で値が他の型に強制される可能性があります)。Michael Kay の本の第 4 章の一時ツリーの検証に関する議論では、「foo」要素を xsl:document 命令で検証属性でラップするという有益な提案を見つけることができます。すぐに明らかになる理由により、変数の名前を変更しました。

<xsl:variable name="test0">
  <xsl:document validation="strict">
    <foo bar="baz"/>      
  </xsl:document>
</xsl:variable>

要素を支配するドキュメントノードではなく、本当に要素にtestバインドしたい場合は、次のように定義できます。foofootest

<xsl:variable name="test" 
              as="schema-element(foo)" 
              select="$test0/foo"/>

2 段階の定義を使用せずに、これを解決するためのより適切な方法があるかもしれませんが、これはエラー メッセージなしで機能します。

于 2013-02-04T19:10:31.647 に答える
1

使ってみました<foo xsl:validation="strict" bar="baz"/>か?エラー メッセージは、結果要素が型注釈なしで作成されていることを示唆しているため、おそらく検証を明示的に要求する必要があり、as属性が十分でない可能性があります。しかし、私はスキーマ対応の XSLT 2.0 にあまり詳しくないので、試してみることをお勧めします。

于 2013-02-04T13:00:37.810 に答える