2016-09-15 2 views
1

Я имею полезную нагрузку, как показано нижемне нужно обрезать полезную нагрузку с помощью XSLT 1.0

<order> 
    <ordernumber>1-123 
    </ordernumber> 
    <orderline> 
     <linenumber>root 
     </linenumber> 
     <parentnumber> 
     </parentnumber> 
     <type>order 
     </type> 
     <actioncode>Existing 
     </actioncode> 
    </orderline> 
    <orderline> 
     <linenumber>x1 
     </linenumber> 
     <parentnumber>root 
     </parentnumber> 
     <type>Bundle 
     </type> 
     <actioncode>Existing 
     </actioncode> 
    </orderline> 
    <orderline> 
     <linenumber>xsub1 
     </linenumber> 
     <parentnumber>x1 
     </parentnumber> 
     <type>Bundle 
     </type> 
     <actioncode>Existing 
     </actioncode> 
    </orderline> 
    <orderline> 
     <linenumber>xsub2 
     </linenumber> 
     <parentnumber>x1 
     </parentnumber> 
     <type>Bundle 
     </type> 
     <actioncode>ADD 
     </actioncode> 
    </orderline> 
    <orderline> 
     <linenumber>xsub3 
     </linenumber> 
     <parentnumber>x1 
     </parentnumber> 
     <type>Bundle 
     </type> 
     <actioncode>Existing 
     </actioncode> 
    </orderline> 
</order> 

Я хочу, чтобы только orderline = ADD и его родительский заказ линии, как показано ниже

<order> 
    <ordernumber>1-123 
    </ordernumber> 
    <orderline> 
     <linenumber>x1 
     </linenumber> 
     <parentnumber>root 
     </parentnumber> 
     <type>Bundle 
     </type> 
     <actioncode>Existing 
     </actioncode> 
    </orderline> 
    <orderline> 
     <linenumber>xsub2 
     </linenumber> 
     <parentnumber>x1 
     </parentnumber> 
     <type>Bundle 
     </type> 
     <actioncode>ADD 
     </actioncode> 
    </orderline> 
</order> 

Я попытался с помощью идентичности но не мог понять логику .... не могли бы вы мне помочь заранее заблаговременно

Это то, что я пробовал, бу т я не в состоянии понять, как получить элемент родительского строки Xsub2 где actioncode = 'ADD'

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="/order/orderline[actioncode !='ADD']"/> 
</xsl:stylesheet> 

ответ

3

Я хотел бы предложить другой подход:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="parent" match="orderline" use="linenumber" /> 

<xsl:template match="/order"> 
    <xsl:copy> 
     <xsl:copy-of select="ordernumber"/> 
     <xsl:for-each select="orderline[actioncode ='ADD']"> 
      <xsl:copy-of select=". | key('parent', parentnumber)"/> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
+0

благодаря michael.hor257k: -) –

Смежные вопросы