XSLT中的复杂上下文处理



重新发布,因为这与我以前的问题不同。

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>