0

我有两个需要合并的 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>

第一个是原始 XML。请求已被提取并发送到系统,接下来是响应。现在我需要合并这两个并将请求 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>

这里有两个问题。

  1. 首先,position()不会匹配。有没有办法获取cm:Request您所在元素的数量/位置,而不是所有兄弟元素的数量/位置?因此,cm:Request无论前面是否有任何元素,第一个总是给出 1。
  2. 其次,由于某种原因,我得到了每个请求中所有响应的副本。如果我更改position()为 example 1,我只会在每个请求中获得第一个响应的副本。我在这里做错了什么?

希望有人知道我应该在这里做什么,因为我现在有点空白,我的 Google-fu 让我失望了:P

总而言之,如何将第 n 个元素与 nameblah与参数节点集中的第 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],对于第二个响应,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 回答