XMLStarlet + XInclude + XSLT

nop77svk

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]

編集
0

コメントを追加

0

関連記事

分類Dev

XMLStarlet + XInclude + XSLT

分類Dev

XSLTスタイルシートにXInclude(eXist-db)

分類Dev

JSON用のXMLstarlet?

分類Dev

XMLstarletとR

分類Dev

xmlstarlet 検索属性

分類Dev

xmlstarlet-改行の削除

分類Dev

Multiple matches of xml to single csv row (xmlstarlet)

分類Dev

xmlstarlet, find a title in XML based on the child tag

分類Dev

xmlstarlet, find a title in XML based on the child tag

分類Dev

Delete nodes on XML using xmlstarlet searching

分類Dev

XMLStarlet-UTF-8北欧文字

分類Dev

Java 6でのxincludeのデフォルトサポート?

分類Dev

再帰的なXIncludeステートメントを含むXML

分類Dev

XIncludeはSaxonで動作しませんか?

分類Dev

XSLT:pipeDocument

分類Dev

どのように無効にXIncludeのにXMLを解析するとき?

分類Dev

xmlstarletを使用したXPathクエリ

分類Dev

xmlstarlet FritzboxFB電話帳からCSVへ

分類Dev

Getting values by using xmlstarlet or xmllint with libxml version 20706

分類Dev

xmlstarletを使用してHTMLを抽出する

分類Dev

xmlstarletによるXML値の更新

分類Dev

JavaでXIncludeを使用しようとし、xml:idでフラグメントを解決します

分類Dev

Xinclude属性xml:baseエラーを使用してXMLファイルを接続しようとしています

分類Dev

同じアプリでxincludeを使用する場合と使用しない場合のjavaxalan変換

分類Dev

XSLT: escaping double quote

分類Dev

XSLTのColspan

分類Dev

動的XSLT変換

分類Dev

XSLT変換

分類Dev

XSLT:node()?vs node()*