0

要素の名前空間をコピーしたい。名前空間属性とその値は異なる場合があり、どの要素でも発生する可能性があります。でも名前空間はそのままコピーしたい。また、名前空間をコピーするための追加として属性を含めるべきではありません。変換に Saxon 9(he) XSLT プロセッサを使用しています。以下の XML ファイルでは<ct-ext:case>"xmlns:ct-ext"属性が欠落している要素を取得しています。を試しcopy-namespaces="yes"ましたが、正しい出力が得られません。さまざまな DTD に共通の XSLT を作成しています。

サンプル XML:

<?xml version="1.0" encoding="UTF-8"?>
<ct:doc identifier="GPPCIA702661235" xsi:schemaLocation="http://test.com/test test.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ct="http://test.com/test" xmlns="http://www.w3.org/1998/Math/MathML" xmlns:ct-ext="http://test.com/test-ext">
<ct:doc-meta identifier="EHIXRW383636159">
<ct:para><ct:inline-math identifier="RCSNDD453018159"><math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mrow><mi>&#x0024;</mi><mn>1.65</mn></mrow></math></ct:inline-math></ct:para>
<ct-ext:case identifier="CDVOXU875594216" xmlns:ct-ext="http://test.com/test-ext">
<ct:simple-meta identifier="HNKRFT326435269">
<ct:title identifier="CGSVLX990515344">This is title</ct:title>
</ct:simple-meta>
</ct-ext:case>
</ct:doc-meta>
</ct:doc>

必要な出力:

<?xml version="1.0" encoding="UTF-8"?>
<ct:doc identifier="GPPCIA702661235" xsi:schemaLocation="http://test.com/test test.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ct="http://test.com/test" xmlns="http://www.w3.org/1998/Math/MathML" xmlns:ct-ext="http://test.com/test-ext">
<ct:doc-meta identifier="EHIXRW383636159">
<ct:para><ct:inline-math identifier="RCSNDD453018159"><math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mrow><mi>&#x0024;</mi><mn>1.65</mn></mrow></math></ct:inline-math></ct:para>
<ct-ext:case identifier="CDVOXU875594216" xmlns:ct-ext="http://test.com/test-ext">
<ct:simple-meta identifier="HNKRFT326435269">
<ct:title identifier="CGSVLX990515344">This is title</ct:title>
</ct:simple-meta>
</ct-ext:case>
</ct:doc-meta>
</ct:doc>

XSLT が試した:

<?xml version='1.0'?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ct="http://test.com/test" xmlns="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:ct-ext="http://test.com/test-ext">
<xsl:output method="xml" encoding="UTF-8" indent="no"/>
<xsl:template match="@*|node()">
<xsl:copy copy-namespaces="yes">
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
4

2 に答える 2

1

Martin の発言を詳しく説明すると、XML ツール (XSLT など) に要件を課しているのに、それらが満たすように設計されていないということです。

より正確な用語を使用すると役立ちます。コピーしようとしているのは名前空間ではなく、名前空間の宣言です。

XML ツールは、指定した名前空間で、指定した XML 要素 (およびその他のノード) を生成できるように設計されています。これは、XML 情報モデルの一部です。出力 XML が適切な名前空間に適切な要素と属性を持っている限り、XML ツールを使用して、使用する名前空間プレフィックス名前空間宣言を配置する場所を指定する必要はありません。

したがって、指定している要件は、下流の XML コンシューマーには必要ありません。名前空間の宣言を特定の方法で行う必要がある理由を説明していただければ、それらの目的を達成する方法、つまり XML 名前空間が機能するように設計されている方法と互換性のある方法を見つけるお手伝いができるかもしれません。

于 2013-07-19T18:49:53.967 に答える