【发布时间】:2013-01-28 13:09:41
【问题描述】:
我有两个 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>
这里有两个问题。
- 首先
position()不匹配。有没有办法获取您所在的cm:Request元素的数量/位置,而不是所有兄弟元素的数量/位置?所以第一个cm:Request总是给出 1,不管它前面是否有任何元素。 - 其次,出于某种原因,我在每个请求中获取了所有响应的副本。如果我将
position()更改为例如1,我只会得到每个请求中第一个响应的副本。我在这里做错了什么?
希望有人知道我应该在这里做什么,因为我现在有点空白,我的 Google-fu 让我失望了:P
总结一下,如何将名称为blah 的第n 个元素与参数节点集中的第n 个子元素匹配?
【问题讨论】: