この質問に答えているときに、XSLT 3.0 (XPath 3.0)serialize()
関数の使用方法は知っているが、スコープ内の名前空間のシリアル化を回避する方法がわからないことに気づきました。最小限の例を次に示します。
XML 入力
<?xml version="1.0" encoding="UTF-8" ?>
<ci:cichlids xmlns:ci="http://www.cichlids.com">
<cichlid id="1">
<name>Zeus</name>
<color>gold</color>
<teeth>molariform</teeth>
<breeding-type>lekking</breeding-type>
</cichlid>
</ci:cichlids>
XSLT 3.0 スタイルシート
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:output="http://www.w3.org/2010/xslt-xquery-serialization"
xmlns:ci="http://www.cichlids.com">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/ci:cichlids/cichlid">
<xsl:variable name="serial-params">
<output:serialization-parameters>
<output:omit-xml-declaration value="yes"/>
</output:serialization-parameters>
</xsl:variable>
<xsl:value-of select="serialize(., $serial-params/*)"/>
</xsl:template>
</xsl:stylesheet>
実際の出力
<?xml version="1.0" encoding="UTF-8"?>
<ci:cichlids xmlns:ci="http://www.cichlids.com">
<cichlid xmlns:ci="http://www.cichlids.com" id="1">
<name>Zeus</name>
<color>gold</color>
<teeth>molariform</teeth>
<breeding-type>lekking</breeding-type>
</cichlid>
</ci:cichlids>
cichlid
シリアル化プロセスには、この要素では使用されていませんが、要素のスコープ内にある名前空間宣言が含まれていました。この宣言を削除して、出力を次のようにしたいと思います
期待される出力
<?xml version="1.0" encoding="UTF-8"?>
<ci:cichlids xmlns:ci="http://www.cichlids.com">
<cichlid id="1">
<name>Zeus</name>
<color>gold</color>
<teeth>molariform</teeth>
<breeding-type>lekking</breeding-type>
</cichlid>
</ci:cichlids>
cichlid
要素を変更してスコープ内の名前空間を削除し、代わりにこの変更された要素をシリアル化する方法を知っています。しかし、これはかなり面倒な解決策のようです。私の質問は:
serialize()
スコープ内にある未使用の名前空間宣言をシリアル化せずに、関数を使用して XML 要素をシリアル化する標準的な方法は何ですか?
Oxygen 内から Saxon-EE 9.6.0.7 を使用してテストします。