2017-08-22 5 views
0

私のXMLには2つのリスト要素が含まれています。最初のループで実行している間、私は最初のループ内の2番目の要素にループを実行する必要があります。あなたは私を助けてくれますか?以下は2つの独立したリストのXSLTでのループ

私はLineNameために別のループを実行し、一致するreferenceToObjectフィールドをコピーしたいというループ内の最初の要素にforループを実行している私のサンプルXML

<?xml version="1.0" encoding="UTF-8"?> 
    <Data> 
     <Object> 
      <ID>123</ID> 
      <List> 
      <ListItem> 
       <ReferenceToObject>123</ReferenceToObject> 
       <Name>ABC</Name> 
      </ListItem> 
      <ListItem> 
       <ReferenceToObject>345</ReferenceToObject> 
       <Name>CDE</Name> 
      </ListItem> 
      <ListItem> 
       <ReferenceToObject>456</ReferenceToObject> 
       <Name>EFG</Name> 
      </ListItem> 
      </List> 
      <Line> 
      <LineItem> 
       <ReferenceToObject>123</ReferenceToObject> 
       <LineName>ABCD</LineName> 
      </LineItem> 
      <LineItem> 
       <ReferenceToObject>345</ReferenceToObject> 
       <LineName>CDEF</LineName> 
      </LineItem> 
      <LineItem> 
       <ReferenceToObject>456</ReferenceToObject> 
       <LineName>EFGH</LineName> 
      </LineItem> 
      </Line> 
     </Object> 
    </Data> 

While running on the first loop i would like to include the elements in the list list where in i can match it using ReferenceToObject. 

The output i want is like below 

<Data> 
    <Object> 
     <ID>123</ID> 
     <List> 
     <ListItem> 
      <ReferenceToObject>123</ReferenceToObject> 
      <Name>ABC</Name> 
      <LineName>ABCD</LineName> 
     </ListItem> 
     <ListItem> 
      <ReferenceToObject>345</ReferenceToObject> 
      <Name>CDE</Name> 
      <LineName>CDEF</LineName> 
     </ListItem> 
     <ListItem> 
      <ReferenceToObject>456</ReferenceToObject> 
      <Name>EFG</Name> 
      <LineName>EFGH</LineName> 
     </ListItem> 
     </List> 
</Object> 
</Data> 

です。

に関してあなたはそれのためにのために、各グループを使用することができます

+0

私たちがあなたのコードを表示するあなたは現在得ている結果とあなたが達成したい結果と一緒に持っていません。あなたはhttps://www.w3.org/TR/xslt20/#xsl-for-each-groupを使用して[tag:xslt-grouping]と[tag:xslt-2.0]という質問をタグ付けしているので、明白なようです –

+0

Thanks @ Martinは、希望の出力でポストを更新し、その後のアプローチは – NKT

+0

です。https://www.w3.org/TR/xslt20/#xsl-for-each-groupを試してみてください。 https://www.w3.org/TR/xslt20/#grouping-examples –

答えて

0

XSLT 2.0

<?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
     <xsl:template match="List"> 
      <xsl:copy> 
       <xsl:for-each-group select="//ListItem|//LineItem" group-by="ReferenceToObject"> 
        <ListItem> 
         <xsl:copy-of select="ReferenceToObject"/> 
         <xsl:copy-of select="current-group()/Name"/> 
         <xsl:copy-of select="current-group()/LineName"/> 
        </ListItem> 
       </xsl:for-each-group> 
      </xsl:copy> 
     </xsl:template> 

     <xsl:template match="Line"/> 

<!-- Identity Transformation --> 
     <xsl:template match="@*|node()"> 
      <xsl:copy> 
       <xsl:apply-templates select="@*|node()"/> 
      </xsl:copy> 
     </xsl:template> 
    </xsl:stylesheet> 

XSLT 1.0あなたがキー

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:key name="refobject" match="LineItem" use="ReferenceToObject"/> 

    <xsl:template match="List"> 
     <xsl:copy> 
      <xsl:for-each select="ListItem"> 
       <xsl:copy> 
        <xsl:copy-of select="child::*"/> 
        <xsl:variable name="currentobj" select="normalize-space(ReferenceToObject)"/> 
        <xsl:copy-of select="key('refobject', $currentobj)/LineName"/> 
       </xsl:copy> 
      </xsl:for-each> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Line"/> 

    <!-- Identity Transformation --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
でこれを扱います
関連する問題