0

マージする必要がある 2 つの XML ドキュメントがあります。

<!-- A.xml -->
<cm:Process>
    <cm:Other />
    <cm:Elements />
    <cm:Request>
        <!-- stuff -->
    </cm:Request>
    <cm:ElementCouldBeHereToo />
    <cm:Request>
        <!-- stuff -->
    </cm:Request>
</cm:Process>

<!-- B.xml -->
<gateway-orders>
    <response>
        <status />
    </response>
    <response>
        <status />
    </response>
</gateway-orders>

1 つ目は元の XML です。要求が取り出されてシステムに送信され、次は応答です。ここで、これら 2 つをマージし、リクエスト N とレスポンス N を一致させて、レスポンスから情報を取得できるようにする必要があります。XSL は A.xml で機能し、B.xml をパラメーターとして取得します。まず、A.xml の要求内に B.xml の正しい応答のコピーを作成しようとしています。

私が抱えている問題は、 を使用できると思っていたのですが、要素が他の要素と混合されているposition()ため、機能しないことに気付きました。cm:Requestどういうわけかこれらを一致させるために使用できる別の方法はありますか?

これは私が試したものです:

<xsl:import href="identity-transform.xsl" />

<xsl:param name="responses" />


<xsl:template match="cm:Request">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
        <xsl:apply-templates select="$responses/*[1]/*[position()]" />
    </xsl:copy>
</xsl:template>

ここには 2 つの問題があります。

  1. まずposition()マッチングしません。cm:Requestすべての兄弟要素の数/位置ではなく、現在の要素の数/位置を取得する方法はありますか? そのため、前に要素があるかどうかに関係なく、最初cm:Requestの要素は常に 1 になります。
  2. 次に、何らかの理由で、各リクエスト内のすべてのレスポンスのコピーを取得します。position()たとえばで変更すると1、各リクエストの最初のレスポンスのコピーのみが取得されます。ここで何が間違っていますか?

誰かが私がここで何をすべきかを知っていることを願っています。なぜなら、私は今少し空白であり、私のGoogle-fuは私を失敗させているからです:P

要約するblahと、パラメーター ノード セット内の n 番目の子と名前を持つ n 番目の要素をどのように一致させることができますか?

4

2 に答える 2

1

これはどうですか:

<xsl:template match="cm:Request">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
        <xsl:variable name="reqNum" select="count(preceding-sibling::cm:Request | .)" />
        <xsl:apply-templates select="$responses/*[1]/response[$reqNum]" />
    </xsl:copy>
</xsl:template>

これを説明するには:

2.次に、何らかの理由で、各リクエスト内のすべてのレスポンスのコピーを取得します。たとえば 1 で position() を変更すると、各リクエストの最初のレスポンスのコピーしか取得できません。ここで何が間違っていますか?

この場合、position()実際には、あなたが思っているのとは異なる振る舞いをしています。そのテンプレートでこれを行った場合:

<xsl:variable name="pos" select="position()" />

次に 、すべての兄弟との関係で$pos現在の位置を持ちますが、ここでは:cm:Request

$responses/*[1]/*[position()]

position()はコンテキストで評価されています$responses/*[1]/*。したがって、最初の<response>this は に評価さ$responses/*[1]/*[1]れ、2 番目の応答では this は に評価されるため$responses/*[1]/*[2]、常に両方が選択されます。

于 2013-01-28T13:38:09.477 に答える
1

あるべき一つの方法

<xsl:template match="cm:Request">
  <xsl:variable name="index"><xsl:number/></xsl:variable>
  <xsl:copy>
     <xsl:apply-templates select="@* | node()"/>
     <xsl:apply-templates select="$responses/*[1]/*[position() = $index]"/>
  </xsl:copy>
</xsl:template>
于 2013-01-28T13:39:06.210 に答える