2

短縮版:

VB 用の LINQ to XML のサンプル、または 1 つの XML 要素を別の XML 要素に変更する方法の XSLT で (変更されていないすべての要素の要素ごとのコピーをハードコーディングせずに) 誰かが提案またはサンプルを提供できますか?

バックグラウンド:

<collection>および複数の<dvd>要素であるルートエントリを含む、適切に形成されていると思われるXMLファイルがあります。DVD には、以下に示すように、ジャンルとタグがあります。(簡単にするために、他の多くの要素を切り取っています)。

私がやりたいことは<Tag、存在する可能性のあるすべての > 要素を追加の<Genre> に変えることです。たとえば、以下のエントリでは、<Genre>Kids </Genre> を追加する必要があります。(実際に TAG 要素の NAME 属性を GENRE 要素に変えようとしているのはわかっていますが、「Tag」と呼ばれる新しい GENRE を作成する方法さえ理解できれば、もっと先に進むことができますそして、おそらく残りを理解することができます.)

私は XML を使って多くのことをしたことがありません。私の理解では、XSLT 変換ファイルと XSLCompiledTransform を使用するか、LINQ to XML を使用することができます (私は Visual Basic 9 を使用しており、VB 内ですべて実行したいと考えています)。[他にも多くのアプローチがあると確信しています。]

問題は、ある要素を別の要素に変換する方法を教えてくれる XSLT または LINQ 構文の例が見つからないことです。すべての要素を 1 つずつコピーするのに十分な LINQ を書き出すことはできますが、変更されないすべての要素のコピーをハードコーディングするよりも簡単な方法が必要です。(あるに違いない!)

したがって、知っている人が私に例を示したり、LINQ や XSLT のスターター コードを少し教えてくれたりしたら、私は永遠に感謝します (OK、永遠ではないかもしれませんが、少なくとも長い間!)。

ありがとう。

サンプル XML:

<Collection>
  <DVD>
    <ID>0000502461</ID>
    <Title>Cirque du Soleil: Alegría</Title>
    <Released>2002-05-31</Released>
    <RunningTime>90</RunningTime>
    <Genres>
      <Genre>Family</Genre>
      <Genre>Music</Genre>
    </Genres>
    <Overview>What if anything were possible? What if ...
    </Overview>
    <Notes/>
    <Tags>
      <Tag Name="Kids" FullName="Kids"/>
    </Tags>
  </DVD>
</Collection>
4

4 に答える 4

2

最も基本的で強力なXSLTデザインパターンの1つを使用して:IDテンプレートをオーバーライドし、この非常に単純な変換を記述して、すべての「ジャンル」要素を「トピック」要素に置き換えます。

<xsl:stylesheet version = "1.0"
 xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">

 <xsl:outputomit-xml-declaration = "yes" />

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

    <xsl:template match = "Genres">
      <トピック>
         <xsl:apply-templates select = "node()| @ *" />
      </トピック>
    </ xsl:template>
</ xsl:stylesheet>

提供されたソースXMLドキュメントに対して適用した場合:

<コレクション>
    <DVD>
        <ID> 0000502461 </ ID>
        <タイトル>シルク・ドゥ・ソレイユ:アレグリア</タイトル>
        <リリース済み>2002-05-31</リリース済み>
        <RunningTime> 90 </ RunningTime>
        <ジャンル>
            <ジャンル>家族</ジャンル>
            <ジャンル>音楽</ジャンル>
        </ジャンル>
        <概要>もし可能だったら?もしも...</概要>
        <注意事項/>
        <タグ>
            <Tag Name = "Kids" FullName = "Kids" />
        </タグ>
    </ DVD>
</コレクション>

必要な結果が生成されます。

<コレクション>
    <DVD>
        <ID> 0000502461 </ ID>
        <タイトル>シルク・ドゥ・ソレイユ:アレグリア</タイトル>
        <リリース済み>2002-05-31</リリース済み>
        <RunningTime> 90 </ RunningTime>
        <トピック>
            <ジャンル>家族</ジャンル>
            <ジャンル>音楽</ジャンル>
        </トピック>
        <概要>もし可能だったら?もしも...</概要>
        <注意事項/>
        <タグ>
            <Tag Name = "Kids" FullName = "Kids" />
        </タグ>
    </ DVD>
</コレクション>

スタイルシートの最初のテンプレートはIDルールです。一致したノードを変更せずにコピーし、その属性または子にテンプレートを再帰的に適用します。他のテンプレートが存在しない場合、このテンプレートはソースxmlドキュメントの同一のコピーを作成するため、その名前が付けられます。

より具体的なテンプレート(名前やその他の条件など、一致したノードのより具体的な詳細を指定する)がある場合、より一般的なテンプレートを「オーバーライド」すると言われます。これは、ノードを処理するためにより具体的なテンプレートが選択されることを意味します。

この非常に強力なデザインパターンを使用すると、次のような処理を数行で実装するのは簡単です。

  1. 何らかの条件を満たすノードをすべて削除します。
  2. ある条件を満たすすべてのノードの名前を変更します。
  3. ある条件を満たすすべてのノードの内容を変更する

他のすべてのノードをそのままコピーします。

この場合、2番目のテンプレートはより具体的であり、「ジャンル」という名前のすべての要素の処理用に選択されます。「トピック」という名前の要素を作成し、その中に現在のすべてのノード属性と子にテンプレートを適用するだけです。

最後、次の変換により、「Tag」要素ごとに、「Genres」の子に新しい「Genre」要素が追加されます

<xsl:stylesheet version = "1.0"
 xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">

 <xsl:outputomit-xml-declaration = "yes" />

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

    <xsl:template match = "Genres">
      <xsl:copy>
         <xsl:apply-templates select = "node()| @ *" />
         <xsl:apply-templates select = "../ Tags / Tag" mode = "Gen" />
      </ xsl:copy>
    </ xsl:template>

    <xsl:template match = "Tag" mode = "Gen">
      <ジャンル>
        <xsl:value-of select = "@ Name" />
      </ジャンル>
    </ xsl:template>
</ xsl:stylesheet>

結果も必要に応じて次のようになります。

<コレクション>
    <DVD>
        <ID> 0000502461 </ ID>
        <タイトル>シルク・ドゥ・ソレイユ:アレグリア</タイトル>
        <リリース済み>2002-05-31</リリース済み>
        <RunningTime> 90 </ RunningTime>
        <ジャンル>
            <ジャンル>家族</ジャンル>
            <ジャンル>音楽</ジャンル>
        <Genre>Kids</Genre>
        </ジャンル>
        <概要>もし可能だったら?もしも...</概要>
        <注意事項/>
        <タグ>
            <Tag Name = "Kids" FullName = "Kids" />
        </タグ>
    </ DVD>
</コレクション>

「IDルール」パターンを使用したその他のコードスニペットは、ここにあります。

于 2008-11-26T23:55:00.250 に答える
1

node()次のように、任意のノードをと一致させることができます。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<!-- Uncomment to remove Tags elements -->
<!-- <xsl:template match="Tags" /> -->

<xsl:template match="Genres">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
        <xsl:for-each select="../Tags/Tag">
            <xsl:element name="Genre">
                <xsl:value-of select="@Name" />
            </xsl:element>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

<!-- Default rule: Copy node and descend -->
<xsl:template match="@*|node()">
        <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
</xsl:template>

</xsl:stylesheet>
于 2008-11-26T23:25:01.900 に答える
0

あなたはこのようなものを探していますか:

 <xsl:template match="Tag">
    <xsl:element name="Genre">
      <xsl:value-of select="@Name"/>           
    </xsl:element>    
  </xsl:template>
于 2008-11-26T23:24:31.793 に答える
0

VB9 でも同じニーズがあり、XSL の代わりに Linq を使用したいと考えていました。私はこれを見つけました:http://msdn.microsoft.com/en-us/library/bb669154.aspxそしてそれは本当にうまくいきました。

于 2009-09-05T17:37:51.163 に答える