2016-08-11 4 views
0

У меня есть XML с несколькими атрибутами. Я хочу выполнить проверку состояния таким образом, что элемент будет перемещен в нужное место. Я не знаю термина или тегов, которые могут использоваться для достижения соответствующего результата.Как выполнить проверку нескольких условий в XSLT

Xml:

<Collection> 

<Allparts> 

    <part> 
     <number>001</number> 
     <material>Platinum</material> 
     <price>High</price> 
    </part> 

    <part> 
     <number>002</number> 
     <material>Gold</material> 
     <price>Medium</price> 
    </part> 

    <part> 
     <number>003</number> 
     <material>Silver</material> 
     <price>Low</price> 
    </part> 


</Allparts> 

<Allboms> 

    <bom> 
     <Part-number>001</Part-number> 
    </bom> 

    <bom> 
     <Part-number>002</Part-number> 
    </bom> 

    <bom> 
     <Part-number>003</Part-number> 
    </bom> 
</Allboms> 

</Collection> 

Необходим выход:

<Collection> 

<Allparts> 

    <part> 
     <number>001</number> 
     <material>Platinum</material> 
     <price>High</price> 
    </part> 

    <part> 
     <number>002</number> 
     <material>Gold</material> 
     <price>Medium</price> 
    </part> 

    <part> 
     <number>003</number> 
     <material>Silver</material> 
     <price>Low</price> 
    </part> 


</Allparts> 

<Allboms> 

    <bom> 
     <Part-number>001</Part-number> 
     <material>Platinum</material> 
     <price>High</price> 
    </bom> 

    <bom> 
     <Part-number>002</Part-number> 
     <material>Gold</material> 
     <price>Medium</price> 
    </bom> 

    <bom> 
     <Part-number>003</Part-number> 
     <material>Silver</material> 
     <price>Low</price> 
    </bom> 
</Allboms> 

</Collection> 

XML, который я Попытаться:

<xsl:template match="bom"> 
    <xsl:copy> 
     <xsl:choose > 
      <xsl:when test= "../../bom/Part-number=../../part/number" > 
      <xsl:apply-templates select= "../../part/material" mode="move" /> 
      </xsl:when > 
     </xsl:choose > 
     <xsl:apply-templates select= "@*|node()" /> 

    </xsl:copy> 

    </xsl:template> 

Пожалуйста, рекомендуем корректировки:

+0

Вам необходимо прочитать '' и 'key (...)' функцию, используемую для построения таблицы поиска и поиска. –

+0

Какая версия XSLT включена? XSLT-1.0 или XSLT-2.0? –

+1

@LingamurthyCS Я использую '

ответ

0

решение ниже XSLT-1,0 должен это сделать:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 


    <xsl:template match="Allboms/bom/Part-number"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
     <xsl:apply-templates select="/Collection/Allparts/part[number = current()]/material | /Collection/Allparts/part[number = current()]/price"/> 
    </xsl:template> 

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

</xsl:stylesheet> 

Есть два шаблона:

  1. тождественное преобразование шаблона: он отлично справляется атрибуты и узлы как есть из входного документа.
  2. Шаблон, который соответствует Part-number, который скопировал бы себя и скопировал соответствующие material и price от Allparts.

Используя клавиши, как предложено @JimGarrison

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:key name="material-by-num" match="/Collection/Allparts/part/material" use="../number"/> 
    <xsl:key name="price-by-num" match="/Collection/Allparts/part/price" use="../number"/> 

    <xsl:template match="Allboms/bom/Part-number"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
     <xsl:apply-templates select="key('material-by-num', .) | key('price-by-num', .)"/> 
    </xsl:template> 

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

</xsl:stylesheet> 

выше XSLT использует два ключевых заявления, чтобы соответствовать material и price используя их значение родственный number «s. Шаблон для Part-number использует эти ключи, чтобы скопировать элементы requried.

+1

Спасибо :) It woked –

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