XMLドキュメントのコンテンツを別のXMLドキュメントに含め、xmlstarlet + XSLTを介して変換したいと思います。XIncludeを使おうとしています。(XIncludeとXSLTの両方の初心者です。私はそうです。)ただし、xmlstarletは、インクルードされたXMLドキュメントを処理せず、インクルージョンノードをそのままにします。
ファイルa.xml
:
<?xml version="1.0" ?>
<doc xmlns:xi="http://www.w3.org/2001/XInclude">
a
<xi:include href="b.xml" />
b
</doc>
ファイルb.xml
:
<?xml version="1.0" ?>
<snippet>
c
</snippet>
x.xsl
「パススルー」テンプレート:
<?xml version="1.0" encoding="windows-1250" ?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" />
<xsl:template match="/">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:transform>
実行するコマンドライン:
xmlstarlet tr x.xsl a.xml
そして、期待される出力は次のようなものになります。
<?xml version="1.0" ?>
<doc xmlns:xi="http://www.w3.org/2001/XInclude">
a
<snippet>
c
</snippet>
b
</doc>
それでも、私が得た結果は次のとおりです。
<?xml version="1.0"?>
<doc xmlns:xi="http://www.w3.org/2001/XInclude">
a
<xi:include href="b.xml"/>
b
</doc>
さて、私は何が間違っているのですか?
npostavsがすでに提案しているように、xmlstarletはデフォルトでドキュメントをXIncludeしないので、これを明示的に言及する必要があります--xinclude
。次に、結果は期待したものになります。
$ xml tr --xinclude x.xsl a.xml
<?xml version="1.0"?>
<doc xmlns:xi="http://www.w3.org/2001/XInclude">
a
<snippet>
c
</snippet>
b
</doc>
xi:
名前空間宣言を除いて、XSLT1.0と単純なで削除することはできません<xsl:copy-of select="."/>
。それが問題であるcopy-namespaces="no"
場合、XSLT 1.0では利用できないため、スタイルシートはもう少し複雑になります。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" />
<xsl:template match="/">
<xsl:apply-templates select="." mode="copy-no-namespaces"/>
</xsl:template>
<xsl:template match="*" mode="copy-no-namespaces">
<xsl:element name="{local-name()}" namespace="{namespace-uri()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="node()" mode="copy-no-namespaces"/>
</xsl:element>
</xsl:template>
<xsl:template match="comment()| processing-instruction()" mode="copy-no-namespaces">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>
これは、Michael Kayがここでcopy-namespaces="no"
説明しているように、XSLT1.0で模倣するための標準的なアプローチです。すると、結果は次のようになります
$ xml tr --xinclude x.xsl a.xml
<?xml version="1.0"?>
<doc>
a
<snippet>
c
</snippet>
b
</doc>
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加