1. ホーム
  2. xml

[解決済み] exclude-result-prefixesが機能しない

2022-02-07 10:20:38

質問

出力のルート要素に @xmlns:* 属性を含めない xslt 変換を書こうとしています。次の xml があるとします。

<?xml version="1.0" encoding="UTF-8"?>
<jw:root xmlns:jw="http://lexisnexis.com/neptune/gtdttest/jw">
    <jw:a/>
    <b test="1">
        <c/>
    </b>
</jw:root>

そしてこのスタイルシートは

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    version="2.0"
    xmlns:jw="http://namespace/test/jw" exclude-result-prefixes="jw">

<xsl:template match="node()|@*">
    <xsl:copy>

         <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="@test"/>

</xsl:stylesheet>

こんなのが出てきました。

<?xml version="1.0" encoding="UTF-8"?>
<jw:root xmlns:jw="http://lexisnexis.com/neptune/gtdttest/jw">
    <jw:a/>
    <b>
        <c/>
    </b>
</jw:root>

試しに - ルートテンプレートに@exclude-result-prefixesを記述する。 - 属性をコピーしない - IDテンプレートで'コピー'を使わず - を使用して、#all

今見つからないのですが、仕様書によると <xsl:copy/> は @exclude-result-prefixes を無視し、他のものは同様にそれを上書きすることができます。

これらの @xmlns:[prefix] atts を削除する方法はありますか?nsは出力が使用するdtdで定義されているので、そこにあるのは困りものです。このような場合、javaで開くだけの別のパスを作成し、その方法で削除する必要があると思います?

ありがとうございます。

解決方法は?

exclude-result-prefixes属性は、(a)リテラルな結果要素に対してのみ機能し、(b)以下のような名前空間のみを排除します。 未使用 - 要素や属性の名前に使用されている名前空間は、常に結果ツリーで宣言されます。

あなたが実現しようとしているのは、入力要素を異なる名前空間になるように修正することです。これは、常に要素名(名前空間+ローカル名)を維持するxsl:copyではできません。を使用して新しい要素を作成する必要があります。 <xsl:element name="{local-name()}"> .

結果の要素や属性に正しい名前をつければ、名前空間の宣言は勝手に行われます。要素や属性の名前は (namespace, localname) のペアであることを忘れないようにしましょう。