2017-02-15 15 views
0

В приведенном ниже XML, мне нужно сортировать только определенный сегмент - имя attrGroupMany = «allergenRelatedInformation» на основе внук значения. Остальная часть XML должна быть сгенерирована так же, как и при сортировке этого сегмента.Сортировать конкретные узлы XML

FDA BIG 8

Так что все allergenSpecificationAgency что имеет "FDA" и allergenSpecificationName имеет "BIG 8" должны прийти до "FDA" и "TREE_NUTS". Просьба предложить, как добиться этого в XSLT. Благодарю.

<ns:MT_TradeItemsExport xmlns:ns="test"> 
<Header version="2.1"> 
    <CreationDateTime>2017-02-09T14:19:03.566Z</CreationDateTime> 
    <MessageID>0072745000010_9f9cd85e-6d30-4152-a51f-d8491df45486</MessageID> 
</Header> 
<Payload> 
    <ItemRegistration> 
     <attr name="numberOfServingsPerPackage">4.0</attr> 
    </ItemRegistration> 
    <attrGroupMany name="organicClaim"> 
     <row> 
      <attr name="organicTradeItemCode">2</attr> 
      <attrMany name="organicClaimAgencyCode"> 
       <value>6</value> 
      </attrMany> 
     </row> 
    </attrGroupMany> 

    <attrGroupMany name="allergenRelatedInformation"> 
     <row> 
      <attr name="allergenSpecificationAgency">FDA</attr> 
      <attr name="allergenSpecificationName">BIG 8</attr> 
      <attrGroupMany name="allergen"> 
       <row> 
        <attr name="allergenTypeCode">AC</attr> 
        <attr name="levelOfContainmentCode">FREE_FROM</attr> 
       </row> 
      </attrGroupMany> 
     </row> 
     <row> 
      <attr name="allergenSpecificationAgency">FDA</attr> 
      <attr name="allergenSpecificationName">BIG 8</attr> 
      <attrGroupMany name="allergen"> 
       <row> 
        <attr name="allergenTypeCode">AE</attr> 
        <attr name="levelOfContainmentCode">FREE_FROM</attr> 
       </row> 
      </attrGroupMany> 
     </row> 
     <row> 
      <attr name="allergenSpecificationAgency">FDA</attr> 
      <attr name="allergenSpecificationName">BIG 8</attr> 
      <attrGroupMany name="allergen"> 
       <row> 
        <attr name="allergenTypeCode">AF</attr> 
        <attr name="levelOfContainmentCode">FREE_FROM</attr> 
       </row> 
      </attrGroupMany> 
     </row> 
     <row> 
      <attr name="allergenSpecificationAgency">FDA</attr> 
      <attr name="allergenSpecificationName">BIG 8</attr> 
      <attrGroupMany name="allergen"> 
       <row> 
        <attr name="allergenTypeCode">AM</attr> 
        <attr name="levelOfContainmentCode">FREE_FROM</attr> 
       </row> 
      </attrGroupMany> 
     </row> 
     <row> 
      <attr name="allergenSpecificationAgency">FDA</attr> 
      <attr name="allergenSpecificationName">BIG 8</attr> 
      <attrGroupMany name="allergen"> 
       <row> 
        <attr name="allergenTypeCode">AN</attr> 
        <attr name="levelOfContainmentCode">FREE_FROM</attr> 
       </row> 
      </attrGroupMany> 
     </row> 
     <row> 
      <attr name="allergenSpecificationAgency">FDA</attr> 
      <attr name="allergenSpecificationName">BIG 8</attr> 
      <attrGroupMany name="allergen"> 
       <row> 
        <attr name="allergenTypeCode">AP</attr> 
        <attr name="levelOfContainmentCode">FREE_FROM</attr> 
       </row> 
      </attrGroupMany> 
     </row> 
     <row> 
      <attr name="allergenSpecificationAgency">FDA</attr> 
      <attr name="allergenSpecificationName">BIG 8</attr> 
      <attrGroupMany name="allergen"> 
       <row> 
        <attr name="allergenTypeCode">AY</attr> 
        <attr name="levelOfContainmentCode">FREE_FROM</attr> 
       </row> 
      </attrGroupMany> 
     </row> 
     <row> 
      <attr name="allergenSpecificationAgency">FDA</attr> 
      <attr name="allergenSpecificationName">TREE_NUTS</attr> 
      <attrGroupMany name="allergen"> 
       <row> 
        <attr name="allergenTypeCode">TN</attr> 
        <attr name="levelOfContainmentCode">FREE_FROM</attr> 
       </row> 
      </attrGroupMany> 
     </row> 
     <row> 
      <attr name="allergenSpecificationAgency">FDA</attr> 
      <attr name="allergenSpecificationName">BIG 8</attr> 
      <attrGroupMany name="allergen"> 
       <row> 
        <attr name="allergenTypeCode">UW</attr> 
        <attr name="levelOfContainmentCode">FREE_FROM</attr> 
       </row> 
      </attrGroupMany> 
     </row> 
    </attrGroupMany> 
</Payload> 

+0

Вы хотите отсортировать 'row' дочерние элементы? Что вы пробовали? Использование 'xsl: apply-templates/xsl: sort' является простым. –

ответ

1

Вы можете использовать xsl:perform-sort или xsl:apply-templates вместе с xsl:sort, чтобы отсортировать row дети используют

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 


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

    <xsl:template match="attrGroupMany[@name ='allergenRelatedInformation']"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:apply-templates select="row"> 
       <xsl:sort select="attr[@name = 'allergenSpecificationAgency']"/> 
       <xsl:sort select="attr[@name = 'allergenSpecificationName']"/> 
      </xsl:apply-templates> 
     </xsl:copy> 
    </xsl:template> 
</xsl:transform> 

http://xsltransform.net/ejivdHR

+0

Спасибо, Мартин. Вы спасли мою жизнь!! – user3092856

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