デフォルトの名前空間を持つ入力 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 を含まない任意の名前空間に一致させるために、テンプレート マッチングの「ルックアップ」を指定する方法はありますか?
ありがとうございました