1

XSLT 2.0 を使用して XML スキーマを変換しています。最初のスキーマ (s1.xsd) は、次のように 2 番目のスキーマ (s2.xsd) をインポートします。

s1.xsdの内容

<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd"
    xmlns:ns1="URI1" targetNamespace="URI2" 
    elementFormDefault="qualified" attributeFormDefault="unqualified">
    <import namespace="URI1" schemaLocation="s2.xsd"/>
    <element name="element1"/>
    <element name="element2"/>
</schema>

およびs2.xsdの内容

<schema xmlns="http://www.w3.org/2001/XMLSchema"
    xmlns:ns1="URI1" targetNamespace="URI1">
    <attribute name="attr1"/>
<schema>

私の XSLT は、次のように XS 名前空間を宣言します。

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

s2.xsd のノードを s1.xsd の <schema> 要素にマージしたいと考えています。これまでのところ、私は試しました

<xsl:template name="merge_imported_schemas">
    <xsl:for-each select="/schema/import[@namespace = //namespace::*]">
        <!-- file exists? -->
        <xsl:choose>
            <xsl:when test="boolean(document(@schemaLocation))">
                <!-- schema found -->
                <xsl:copy-of select="document(@schemaLocation)/*/node()"/>
            </xsl:when>
            <xsl:otherwise>
                <!-- schema not found -->
                <xsl:message terminate="yes">
            </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each>
</xsl:template>

しかし、私は望ましい結果が得られません。誰かが私が間違っていることを教えてもらえますか? ここには名前空間の衝突があるのではないかと思いますが、正直なところ、名前空間の使用は少し混乱しています。ありがとう!

4

1 に答える 1

2

XPath の要素を修飾する必要があります。select="/schema/import[@namespace = //namespace::*]">element がないため、現時点では何にも一致しません/schema。XPath は、名前空間のない要素を照合しようとしています。

に変更するとselect="/xs:schema/xs:import[@namespace = //namespace::*]">、動作するはずです。

名前空間プレフィックスは名前空間 URI のエイリアスであり、(xsd ファイルのように) デフォルトの名前空間がある場合、プレフィックスのない要素は引き続き名前空間で修飾されることに注意してください。

余談ですが、 の代わりに を使用し、出力ツリーにコピーするさまざまな種類のノードに対してさまざまなテンプレートを定義すると、<xsl:for-each select="/schema/import[@namespace = //namespace::*]">より成功する可能性があります。<xsl:apply-templates select="/xs:schema/node()"

于 2010-05-20T12:53:47.050 に答える