1

以下に示す形式のXMLファイルがあります。

<toploop id="iamroot">
    <firstinner>
        <inner1 Sequence="001">
          <Number>321</Number>
        </inner1>
        <inner1 Sequence="002">
          <Number>345</Number>
        </inner1>
    </firstinner>
    <secondinner>
        <inner2 Sequence="001">
          <Number>321</Number>
          <secondNumber>189</secondNumber>
        </inner2>
        <inner2 Sequence="002">
          <Number>345</Number>
          <secondNumber>998</secondNumber>
        </inner2>
    </secondinner>
</toploop>

私は多くのことを試しましたが、XSLT / XPathを初めて使用するため、以下のようなデータを表すクエリを取得できません。

iamroot,001,321,189
iamroot,002,345,998

ご覧のとおり、firstinnerタグのinner1シーケンス、numberがsecondinnerタグのinner2シーケンスと一致するかどうかを確認し、numberして、secondinnerタグのinner2のsecondNumberタグ値をこれらの横にプルします。SQLの2つのテーブルの内部結合のように。XSLTでこれを行うことはできますか?値の照合を試みましたが、同じXMLファイル内のデータを照合する方法がわかりません。助けてください。前もって感謝します。同じようにXalan-Cを使用しています。

更新: KayとLarsHに感謝します。次のスクリプトを試しました。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output  method="text" />
<xsl:template match="inner2" />   
<xsl:template match="inner1">
<xsl:variable name="inner2" select="../../secondinner/inner2[Number = current()/Number and @Sequence = current()/@Sequence]"/>   
<xsl:if test="$inner2">     
<xsl:value-of select="concat(/toploop/@id, ',', /toploop/firstinner/inner1/@Sequence, ',', /toploop/firstinner/inner1/Number, ',', $inner2/secondNumber, ',')" />
</xsl:if> 
</xsl:template> 
</xsl:stylesheet>

以下のような出力が得られます。

    iamroot,001,321,189,
    iamroot,002,345,998,

レコードの前に先頭のスペースがなく、データ行の上下に不要な行がない場合、このフォーマットを以下のようにするにはどうすればよいですか。

iamroot、001,321,189、

iamroot、002,345,998、

再度、感謝します。

4

2 に答える 2

4

このようなもの:

<xsl:template match="inner1">
  <xsl:variable name="inner2" 
   select="../../secondinner/inner2[Number = current()/Number 
                                    and @Sequence = current()/@Sequence"/>
  <xsl:if test="$inner2">
    <xsl:value-of select="concat(../../@id, ',', @Sequence, ',', 
                          Number, ',', $inner2/secondNumber"/>
  </xsl:if>
</xsl:template>

ここでは、一方と他方にバインドされた 2 つのものを.結合してcurrent()います。

3 つ以上のノード セット間の結合を可能にするより一般的なソリューションについては、明示的な変数をバインドできます<xsl:variable name="one" select="."/>

于 2011-07-19T08:31:35.927 に答える
1

タイプミスを修正する以外@inner2$inner2...

また、処理したくない要素を「飲み込む」ためのテンプレートを追加する必要があります。現在、デフォルトのテンプレートは、inner1 以外のすべての要素の文字列コンテンツを出力にコピーしています。したがって、少なくとも inner2 要素については、そのデフォルト テンプレートをオーバーライドする必要があります。

<xsl:template match="inner2" />

このテンプレートが空であるという事実は、<inner2>要素が何も出力せず、子孫を処理せずに消費されることを意味します。

于 2011-07-19T16:20:16.780 に答える