1

XSLT 1.0 を使用して xml 変換を作成しようとしていますが、これはまったく新しいので、その場で取り上げます。私の質問は次のとおりです。

<xsl:for-each select="ns0:BxfMessage/ns0:BxfData/ns0:Content" >
<xsl:if test="string(@version) = 'Series'">

if ステートメントは、タグに埋め込まれた文字列をチェックするためにあります。次のようになります。

<Content version="Series" action="update">

ここで私の質問は、現在の for each ループ内に別の for each ループが必要ですが、同じレベル (ns0:BxfMessage/ns0:BxfData/ns0:Content) を調べる必要があり、それを使用して別の for each ループを作成した場合探している選択

 ns0:BxfMessage/ns0:BxfData/ns0:Content/ns0:BxfMessage/ns0:BxfData/ns0:Content 

これは役に立ちません。同じレベルを見て、別の if ステートメントを使用してそのバージョン文字列を読み取る必要があります。これは、子を使用してツリーを構築する出力が必要だからです。残念ながら、シリーズ、タイトル、バージョンをすべて同じレベルでランク付けする入力 xml を変更することはできず、強制的に構造化する必要があります。

乾杯

4

1 に答える 1

0

残念ながら、入力 xmlを変更することはできませんが、これは XSLT です...もちろん、処理する直前に変更できます。しかし、その必要はありません。

XSL には、現在のテンプレート内に「コンテキスト ノード」の概念があるため、選択できるはずです。

select="../ns0:Content/..."

ただし、それらを直接選択することもできます (元の選択で):

select="ns0:BxfMessage/ns0:BxfData/ns0:Content[@version='Series']"

または相対的に:

select="../ns0:Content[@version='Series']"

必要に応じて、それぞれに異なるテンプレートを提供してください。

私には、これらの要素の親を選択し、ns0:BxfDataコンテキストに対する相対セレクターを使用して、リストではなくツリーを書き出す必要があるように思えます。それなら、まったく必要ないかもしれませんfor-each

<xsl:template match="ns0:BxfMessage/ns0:BxfData">
  <xsl:element name="Rank">
    <xsl:element name="Series>
      <xsl:copy-of select="./ns0:Content[@version='Series']/@action" />
    </xsl:element>
    <xsl:element name="Title">
      <xsl:copy-of select="./ns0:Content[@version='Title']/@action" />
    </xsl:element>
    <xsl:element name="Version">
      <xsl:copy-of select="./ns0:Content[@version='Version']/@action" />
    </xsl:element>
  </xsl:element>
</xsl:template>

次のような新しい XML を発行する必要があります。

<Rank>
  <Series action="update" />
  <Title action="..." />
  <Version action="..." />
</Rank>

構文が少しずれている可能性があります (変換を行ってからしばらく経ちます) が、考え方は明確なはずです。このテンプレートを汎用テンプレートと組み合わせて、デフォルトで保持したいすべてのノードをコピーすると、ループを必要とせずに機能するはずです。

于 2013-10-01T16:10:38.343 に答える