2016-12-05 57 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> 
相關問題