重新发布,因为这与我以前的问题不同。
hi xslt gurus,
我有一些复杂的要求。在使用另一个节点上下文时,我需要从另一个节点获取值。请参阅下面的示例:
<ObjectEvent>
<epcList>
<epc>111</epc>
<epc>222</epc>
</epcList>
<material>ABC</material>
</ObjectEvent>
<ObjectEvent>
<epcList>
<epc>333</epc>
</epcList>
<material>DEF</material>
</ObjectEvent>
<ObjectEvent>
<epcList>
<epc>containerFOR111222</epc>
</epcList>
</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>
我已经获得了材料,批次,系列,总计,EPC和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>
我的实际来源,目标消息和映射要比这要复杂得多,希望能从一个简单的解决方案开始,然后才能达到更高的复杂性
谢谢!
您可以使用xsl:key
从任意标识符到元素构建地图。
以下模板使用每个AggregationEvent
中的第一个epc
元素作为事件parentID
的键。然后,它用于查找与material
事件中第一个epc
相关的parentID
。
这假设第一个epc
始终存在并且是唯一的。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:key name="epc-key" match="parentID" use="../childEPCs/epc[1]"/>
<xsl:template match="/">
<xsl:for-each select="//ObjectEvent/material">
<MATERIAL>
<BATCH>
<xsl:value-of select="."/>
</BATCH>
<SERIES>
<TOTAL>
<xsl:value-of select="count(../epcList/epc)"/>
</TOTAL>
<EPCS>
<xsl:for-each select="../epcList/epc">
<EPC>
<xsl:value-of select="."/>
</EPC>
</xsl:for-each>
<CONTAINER>
<xsl:value-of select="key('epc-key', ../epcList/epc[1])"/>
</CONTAINER>
</EPCS>
</SERIES>
</MATERIAL>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>