0

デフォルトの名前空間を持つ入力 xml があります。例えば以下のように。

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="aaa">
<subroot>
    <country>aaa</country>
    <country>bbb</country>
    <country>ccc</country>
</subroot>
</root>

変換中に xpath-default-namespace="aaa" を使用します。そうしないと xpath が一致しないためです。ここでも、xsl キー関数を使用してルックアップ xml を読み取る必要があります。例えば以下のように

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xpath-default-namespace="aaa" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:variable name="LookupDoc" select="document('lookup.xml')" />
<xsl:key name="ObjectType-lookup" match="lookup" use="@att1" />

<xsl:template match="//country">
    <countrynew>
        <xsl:apply-templates select="$LookupDoc/*">
            <xsl:with-param name="curr-code" select="string(.)" />
        </xsl:apply-templates>
    </countrynew>
</xsl:template>

<xsl:template match='lookups'>
    <xsl:param name="curr-code" />
    <xsl:value-of select="key( 'ObjectType-lookup' , normalize-space($curr-code))/@att2" />
</xsl:template>

スタイルシート要素 xpath "//country" のデフォルトの名前空間では正常に動作します。名前空間を持たないルックアップ xml を読み取ると、問題が発生します。例えば:

<?xml version="1.0" encoding="UTF-8"?>
<x:lookups>
     <lookup att1="aaa" att2="zzz"/>
     <lookup att1="bbb" att2="yyy"/>
     <lookup att1="ccc" att2="xxx"/>
</x:lookups>

xpath-default-namespace を無視するか、namespace を含まない任意の名前空間に一致させるために、テンプレート マッチングの「ルックアップ」を指定する方法はありますか?

ありがとうございました

4

2 に答える 2

1

xpath-default-namespace を無視するか、namespace を含まない任意の名前空間に一致させるために、テンプレート マッチングの「ルックアップ」を指定する方法はありますか?

スタイルシートのどこにでも指定できますxpath-default-namespace。XPath 式はツリーを検索し、「最も近い祖先」の値を使用します。

スタイルシート内の任意の要素について、この属性には有効な値があります。これは、[xsl:]xpath-default-namespaceその要素またはそのような属性を指定する最も内側の要素の値です。

( XSLT 2.0仕様より)

だからあなたは言うことができます

<xsl:template match='lookups' xpath-default-namespace=''>

要素で指定されたデフォルトの名前空間をオーバーライドしますxsl:stylesheet。次のように、スタイルシートのリテラル結果要素で指定することもできますxsl:xpath-default-namespace

<something xsl:xpath-default-namespace="bbb" attr="{foo}" />

これにより、現在のコンテキスト ノードの子要素の値である<something attr="xxx" />whereが作成されます。xxx{bbb}foo

于 2013-02-13T11:54:59.140 に答える