我有一个复杂的要求。我需要从另一个节点获取值,同时使用来自另一个节点的上下文。请参阅下面的样本:
<ObjectEvent>
<epcList>
<epc>111</epc>
<epc>222</epc>
</epcList>
<material>ABC</material>
</ObjectEvent>
<ObjectEvent>
<epcList>
<epc>containerFOR111222</epc>
</epcList>
</ObjectEvent>
<ObjectEvent>
<epcList>
<epc>333</epc>
</epcList>
<material>DEF</material>
</ObjectEvent>
<ObjectEvent>
<epcList>
<epc>containerFOR333</epc>
</epcList>
</ObjectEvent>
<AggregationEvent>
<parentID>containerFOR111222</parentID>
<childEPCs>
<epc>111</epc>
<epc>222</epc>
</childEPCs>
</AggregationEvent>
<AggregationEvent>
<parentID>containerFOR333</parentID>
<childEPCs>
<epc>333</epc>
</childEPCs>
</AggregationEvent>
父节点的数量将取决于独特的材料。因此,在这种情况下,将出现2。输出应该如下所示:
<MATERIAL>
<BATCH>ABC</BATCH>
<SERIES>
<TOTAL>2</TOTAL>
<EPCS>
<EPC>111</EPC>
<CONTAINER>containerFOR111222</CONTAINER>
</EPCS>
<EPCS>
<EPC>222</EPC>
<CONTAINER>containerFOR111222</CONTAINER>
</EPCS>
</SERIES>
</MATERIAL>
<MATERIAL>
<BATCH>DEF</BATCH>
<SERIES>
<TOTAL>1</TOTAL>
<EPCS>
<EPC>333</EPC>
<CONTAINER>containerFOR333</CONTAINER>
</EPCS>
</SERIES>
</MATERIAL>
我已经得到了材料,批,系列,总计,EPCS和EPC的权利。问题在于容器字段。我无法得到第二个上下文(containerFOR333)的值。我只是得到了第一个上下文的值:
这是我现在的地图。我对集装箱没有什么想法:
<xsl:for-each select="//ObjectEvent/material">
<MATERIAL>
<BATCH>
<xsl:value-of select="./material"/>
</BATCH>
<SERIES>
<TOTAL>
<xsl:value-of select="count(./epcList/epc"/>
</TOTAL>
<xsl:for-each select="./epcList/epc">
<EPCS>
<EPC>
<xsl:value-of select="./epcList/epc"/>
</EPC>
<CONTAINER>???</CONTAINER>
</EPCS>
</xsl:for-each>
</SERIES>
</MATERIAL>
</xsl:for-each>
我的实际来源、目标消息和映射要比这个复杂得多,所以希望我能够从一个简单的解决方案开始,然后用更高的复杂度解决问题。
谢谢!
发布于 2016-12-01 01:10:21
如果--正如您在注释中所说的-- ObjectEvent
节点成对出现,那么您需要执行如下操作:
<xsl:for-each select="//ObjectEvent[position() mod 2 = 1]">
<MATERIAL>
<BATCH>
<xsl:value-of select="material"/>
</BATCH>
<SERIES>
<TOTAL>
<xsl:value-of select="count(epcList/epc)"/>
</TOTAL>
<xsl:for-each select="epcList/epc">
<EPCS>
<EPC>
<xsl:value-of select="."/>
</EPC>
<CONTAINER>
<xsl:value-of select="../../following-sibling::ObjectEvent[1]/epcList/epc"/>
</CONTAINER>
</EPCS>
</xsl:for-each>
</SERIES>
</MATERIAL>
</xsl:for-each>
演示(使用格式良好的输入):http://xsltransform.net/gWEamLj
https://stackoverflow.com/questions/40893114
复制相似问题