2

2 つのソース xml ファイルがあり、「名前」がプレーン テキスト ファイルに含まれているかどうかに応じて、いずれかのファイルに対して選択された要素を含む新しい xml ファイルを作成する必要があります。

xml ファイル a:

<data name="name1">
  <value>abc1</value>
</data>
<data name="name2">
  <value>abc2</value>
</data>
<data name="name3">
  <value>abc3</value>
</data>

xml ファイル b:

<data name="name1">
  <value>xyz1</value>
</data>
<data name="name2">
  <value>xyz2</value>
</data>
<data name="name3">
  <value>xyz3</value>
</data>

テキストファイル:

name1
name3

望ましい出力:

<data name="name1">
  <value>abc1</value>
</data>
<data name="name2">
  <value>xyz2</value>        <---- note this element is from file 'b'
</data>
<data name="name3">
  <value>abc3</value>
</data>

したがって、'name1' と 'name3' という名前の要素は、テキスト ファイルにリストされているため、'xml ファイル a' から取得されますが、'name2' は、そうでないため、'xml ファイル b' から取得されます。

実際の名前は「name1」などではなく、任意の文字列識別子ですが、ファイル内で一意です。

XSLTでこれを行うことは可能ですか?

4

2 に答える 2

3

この変換

<xsl:stylesheet version="2.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:variable name="vNames" select=
    "tokenize(unparsed-text('file:///c:/temp/delete/Names.txt'), '\s')"/>

    <xsl:variable name="vDoc1" select="document('file:///c:/temp/delete/FileA.xml')"/>
    <xsl:variable name="vDoc2" select="document('file:///c:/temp/delete/FileB.xml')"/>

 <xsl:template match="/">
     <t>
       <xsl:sequence select=
        "$vDoc1/*/*[@name = $vNames],
         $vDoc2/*/*[not(@name = $vNames)]
        "/>
     </t>
 </xsl:template>
</xsl:stylesheet>

XMLドキュメント(未使用)に適用され、次の2つのファイルがある場合

c:/temp/delete/FileA.xml

<t>
    <data name="name1">
        <value>abc1</value>
    </data>
    <data name="name2">
        <value>abc2</value>
    </data>
    <data name="name3">
        <value>abc3</value>
    </data>
</t>

c:/temp/delete/FileB.xml

<t>
    <data name="name1">
        <value>xyz1</value>
    </data>
    <data name="name2">
        <value>xyz2</value>
    </data>
    <data name="name3">
        <value>xyz3</value>
    </data>
</t>

c:/temp/delete/Names.txt

name1
name3

必要な正しい結果を生成します。

<t>
   <data name="name1">
            <value>abc1</value>
      </data>
   <data name="name3">
            <value>abc3</value>
      </data>
   <data name="name2">
            <value>xyz2</value>
      </data>
</t>

説明

標準のXSLT関数の適切な使用:unparsed-text()(2.0以降のみ)およびdocument()標準のXPath2.0関数tokenize()

于 2012-12-17T20:46:01.323 に答える
-1

XSLT はプレーン テキストを出力できますが、入力ドキュメントは XML であると想定されます。ただし、変換に Java を混在させることは可能です。個人的には、いくつかの Java 関数を追加してファイルを開き、grepのような方法で処理します。

XSLT スタイルシートへの Java 関数の追加に関するこの一般的なチュートリアルは、良い出発点になるでしょう。いくつかのより一般的な XSLT 処理エンジンのハウツーについて言及しているという利点があります。

これはSOに関する関連する議論です

于 2012-12-17T19:01:24.290 に答える