3

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>

さて、私は何を間違っていますか?

4

1 に答える 1

3

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>

XSLT xi:1.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"説明しているように、XSLT 1.0 で模倣するための標準的なアプローチです。すると、結果は

$ xml tr --xinclude x.xsl a.xml
<?xml version="1.0"?>
<doc>
a
<snippet>
c
</snippet>
b
</doc>
于 2015-03-27T16:48:39.660 に答える