2

他のいくつかのxmlファイルにアクセスするためにxincludeを使用するxmlドキュメントがあります。

<chapter xml:id="chapter1">
<title>Chapter in Main Doc</title>
<section xml:id="section">
    <title>Section in Main Doc 1</title>
            <mediaobject>
                <imageobject>
                    <imagedata fileref="images/car.jpg"/>
                </imageobject>
            </mediaobject>
</section>
<xi:include href="../some-doc/section1.xml"/>
<xi:include href="../some-doc/section2.xml"/>

これらの他の section1 および section2 xml ファイルは、異なるソースの場所で異なる画像を使用しています。これらのすべての画像を単一の出力ディレクトリにコピーする必要があります。そのため、最初は、XSLT を使用して xml ドキュメント全体を解析し、コピーする画像のリストを生成することを計画しています。XSLT を使用して xml ファイルの画像のリストを生成するにはどうすればよいですか? あなたのアイデアは本当に感謝しています。

前もって感謝します..!!

追加した:

以下の回答済み XSLT 1.0 コードを試してみました。それを使用してhtml出力を生成すると、「chapter1、section ...」のような章とセクションIDのみが表示されます。imagedata ノード内のイメージ パス値は表示されません。

しかし、変更すると、xincluded xml ファイルのすべての画像パス値も表示されます<xsl:template match="@*|node()"><xsl:template match="*">しかし、上記のような他のノードの値もあります。画像パス以外のすべての値をフィルター処理する必要があります。

ここでは、すべての xml ドキュメントのイメージ パスのみをコピーし、それらのすべてのパスを配列などに保持する必要があります。次に、Javaクラスを使用して、保存された画像パスを画像コピーの目的で使用できます。

4

1 に答える 1

5

これは完全な解決策ではありませんが、ニーズには十分かもしれません。次の XSLT 2.0 スタイルシートはドキュメントをコピーし、XIncludes を展開します (以下に注意事項があります)。

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xi="http://www.w3.org/2001/XInclude"
  xmlns:fn="http://www.w3.org/2005/xpath-functions"
  exclude-result-prefixes='xsl xi fn'>
<xsl:output method="xml" indent="yes"/>

<xsl:template match="@*|node()">
 <xsl:copy>
  <xsl:apply-templates select="@*|node()"/>
 </xsl:copy>
</xsl:template>

<xsl:template match="xi:include[@href][@parse='xml' or not(@parse)][fn:unparsed-text-available(@href)]">
 <xsl:apply-templates select="fn:document(@href)" />
</xsl:template>

<xsl:template match="xi:include[@href][@parse='text'][fn:unparsed-text-available(@href)]">
 <xsl:apply-templates select="fn:unparsed-text(@href,@encoding)" />
</xsl:template>

<xsl:template match="xi:include[@href][@parse=('text','xml') or not(@parse)][not(fn:unparsed-text-available(@href))][xi:fallback]">
 <xsl:apply-templates select="xi:fallback/text()" />
</xsl:template>

<xsl:template match="xi:include" />

</xsl:stylesheet> 

注意事項

このソリューションは、属性 xpointer、accept、accept-language を実装していません。

無効になった XSLT 1.0 バリアント

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xi="http://www.w3.org/2001/XInclude"
  exclude-result-prefixes='xsl xi'>
<xsl:output method="xml" indent="yes"/>

<xsl:template match="@*|node()">
 <xsl:copy>
  <xsl:apply-templates select="@*|node()"/>
 </xsl:copy>
</xsl:template>

<xsl:template match="xi:include[@href][@parse='xml' or not(@parse)]">
 <xsl:apply-templates select="document(@href)" />
</xsl:template>

<xsl:template match="xi:include" />

</xsl:stylesheet> 
于 2012-07-16T00:05:11.453 に答える