2016-12-05 54 views
0

重新张贴,因为它是从我刚才的问题不同的需求..复杂的情况下在XSLT

嗨XSLT处理的大师,

我有一点复杂的要求。我需要从另一个节点获取来自另一个节点的值。 请参见下面的示例:

<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> 

我已经拿到材料,批,系列,TOTAL,EPCS和EPC的权利。问题在于CONTAINER字段。我无法获得第二个上下文的值(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> 

我的实际来源,目标信息和测绘是比这要复杂得多,所以希望病人能够从一个简单的解决方案工作,那么我的方式,以更高的复杂性

感谢!

回答

0

您可以使用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> 
相关问题