6

いくつかの xml ファイルがあり、その名前は別の xml ファイルに保存されています。

xsl を使用して、xml ファイルの組み合わせの概要を作成したいと考えています。msxml 拡張機能を使用してこれを行う方法があったことを覚えています (私は msxml を使用しています)。

を使用して各ファイルのコンテンツを取得できることはわかっていますが、select="document(filename)"これらすべてのドキュメントを 1 つに結合する方法がわかりません。

2008 年 10 月 21 日 結合した xml に対してさらに処理を行う必要があることを述べておく必要がありました。そのため、変換から出力するだけでは十分ではなく、ノード セットとして変数に格納する必要があります。

4

4 に答える 4

4

以下は、できることのほんの一例です。

file1.xml:

<foo>
<bar>Text from file1</bar>
</foo>

file2.xml:

<foo>
<bar>Text from file2</bar>
</foo>

index.xml:

<index>
<filename>file1.xml</filename>
<filename>file2.xml</filename>

要約.xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exsl="http://exslt.org/common"
    extension-element-prefixes="exsl">

  <xsl:variable name="big-doc-rtf">
      <xsl:for-each select="/index/filename">
        <xsl:copy-of select="document(.)"/>
      </xsl:for-each>
  </xsl:variable>

  <xsl:variable name="big-doc" select="exsl:node-set($big-doc-rtf)"/>

  <xsl:template match="/">
    <xsl:element name="summary">
      <xsl:apply-templates select="$big-doc/foo"/>
    </xsl:element>  
  </xsl:template>

  <xsl:template match="foo">
    <xsl:element name="text">
      <xsl:value-of select="bar"/>
    </xsl:element>  
  </xsl:template>

</xsl:stylesheet>

スタイルシートをindex.xmlに適用すると、次のようになります。

<?xml version="1.0" encoding="UTF-8"?><summary><text>Text from file1</text><text>Text from file2</text></summary>

秘訣は、ドキュメント関数 (ほぼすべての XSLT 1.0 プロセッサでサポートされている拡張関数) を使用してさまざまなドキュメントをロードし、内容を変数本体の一部として出力してから、さらに処理するために変数をノード セットに変換することです。

于 2008-10-20T06:53:20.780 に答える
2

次のようなファイルにファイル名がリストされているとします。

<files>
    <file>a.xml</file>
    <file>b.xml</file>
</files>

次に、上記のファイルで次のようなスタイルシートを使用できます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
        <root>
            <xsl:apply-templates select="files/file"/>                          
        </root>
    </xsl:template>

    <xsl:template match="file">
        <xsl:copy-of select="document(.)"/>
    </xsl:template>
</xsl:stylesheet>
于 2008-10-20T06:56:51.897 に答える
0

document()関数のドキュメントをご覧ください。

を使用document()して、変換プロセス中にさらに XML ドキュメントを読み込むことができます。これらはノード セットとしてロードされます。つまり、最初に、ロードするファイル名を含む XML を XSLT にフィードし、そこから取得します。

<xsl:copy-of select="document(@href)/"/>
于 2008-10-20T06:43:02.143 に答える
0

すべての答えをありがとう。msxml で使用しているソリューションの内容は次のとおりです。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ms="urn:schemas-microsoft-com:xslt">
  <xsl:output method="xml"/>
  <xsl:template match="/">
    <xsl:variable name="combined">
      <xsl:apply-templates select="files"/>
    </xsl:variable>
    <xsl:copy-of select="ms:node-set($combined)"/>
  </xsl:template>
  <xsl:template match="files">
    <multifile>
      <xsl:apply-templates select="file"/>
    </multifile>
  </xsl:template>
  <xsl:template match="file">
    <xsl:copy-of select="document(@name)"/>
  </xsl:template>
</xsl:stylesheet>

各ファイルは約 8 MB であり、変換には非常に長い時間がかかるため、パフォーマンスを改善しようとしていますが、それは別の問題です。

于 2008-10-21T01:25:13.533 に答える