2014-02-12 6 views
0

У меня есть XML так:XML - XSL Группа по

<produits> 
    <produit> 
    <CAT>GENCABI</CAT> 
    <ITEMCODE>100-0190</ITEMCODE> 
    <DESCR>Broches Henry Schein Longueur 21Mm Taille 40</DESCR> 
    <EXTDESC>Broches Henry Schein Longueur 21Mm Taille 40</EXTDESC> 
    <ITEMSET>100-9231</ITEMSET> 
    <MANUF>1</MANUF> 
    <IMAGE>100-0190</IMAGE> 
    <TOC>8</TOC> 
    <SUBTOC>3</SUBTOC> 
    </produit> 
    <produit> 
    <CAT>GENCABI</CAT> 
    <ITEMCODE>100-0240</ITEMCODE> 
    <DESCR>Racleurs 25Mm No40 (6)      Schein</DESCR> 
    <EXTDESC>Racleurs 25Mm No40 (6) Schein</EXTDESC> 
    <ITEMSET>100-9231</ITEMSET> 
    <MANUF>1</MANUF> 
    <IMAGE>100-0240</IMAGE> 
    <TOC>8</TOC> 
    <SUBTOC>3</SUBTOC> 
    </produit> 
    <produit> 
    <CAT>GENCABI</CAT> 
    <ITEMCODE>100-0379</ITEMCODE> 
    <DESCR>Finger Plugger Henry Schein 25Mm B</DESCR> 
    <EXTDESC>Pour condensation laterale de la gutta manche plastique. Rouge</EXTDESC> 
    <ITEMSET>100-8766</ITEMSET> 
    <MANUF>1</MANUF> 
    <IMAGE>100-8766</IMAGE> 
    <TOC>8</TOC> 
    <SUBTOC>9</SUBTOC> 
    </produit> 
</produits> 

Стараюсь группы ДЕТАЛЬ "НИКАКИХ гарантий". я это делаю с XSL вроде этого:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output indent="yes"/> 
<xsl:key name="produit-by-ITEMSET" match="produit" use="ITEMSET" /> 
    <xsl:template match="/produits"> 
    <xsl:copy> 
     <xsl:apply-templates select="*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="produit"> 
    <xsl:if test="generate-id() = generate-id(key('produit-by-ITEMSET', ITEMSET)[1])"> 
    <produit> 
     <xsl:attribute name="ParentItem"> 
      <xsl:value-of select="ITEMSET"/> 
     </xsl:attribute> 
     <xsl:for-each select="../produit[ITEMSET=current()/ITEMSET]"> 
      <child> 
      <xsl:copy-of select="ITEMCODE" /> 
      <xsl:copy-of select="DESCR" /> 
      <xsl:copy-of select="EXTDESC" /> 
      <xsl:copy-of select="MANUF" /> 
      <xsl:copy-of select="IMAGE" /> 
      </child> 

     </xsl:for-each> 
     </produit> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

я получил, что я whant для пункта с кратным «ребенком», но я хочу, чтобы избавиться от «ребенка» тега, если есть только один ребенок.

На мой взгляд, у меня есть что-то вроде «если подсчет (выберите childs)> 1 отображающий дочерний тег, иначе не поместил дочерний тег». Но я довольно новый с XSL/XML и lillte немного потеряли ... Если кто-нибудь есть советы ...

Edit: Добавить выходной XML У меня есть & Я хочу

Выхода у меня есть:

<produits> 
<produit ParentItem="100-9231"> 
<child> 
<ITEMCODE>100-0190</ITEMCODE> 
<DESCR>Broches Henry Schein Longueur 21Mm Taille 40</DESCR> 
<EXTDESC>Broches Henry Schein Longueur 21Mm Taille 40</EXTDESC> 
<MANUF>1</MANUF> 
<IMAGE>100-0190</IMAGE> 
</child> 
<child> 
<ITEMCODE>100-0583</ITEMCODE> 
<DESCR>Broches Henry Schein Longueur 21Mm Taille 30</DESCR> 
<EXTDESC>Broches Henry Schein Longueur 21Mm Taille 30</EXTDESC> 
<MANUF>1</MANUF> 
<IMAGE>100-0583</IMAGE> 
</child> 
<child> 
<ITEMCODE>100-0720</ITEMCODE> 
<DESCR>Broches Henry Schein Longueur 21 Mm Taille 15</DESCR> 
<EXTDESC>Broches Henry Schein Longueur 21 Mm Taille 15</EXTDESC> 
<MANUF>1</MANUF> 
<IMAGE>100-0720</IMAGE> 
</child> 
</produit> 
<produit ParentItem="968-2000"> 
<child> 
<ITEMCODE>968-2000</ITEMCODE> 
<DESCR>Aiguilles Medicales Terumo</DESCR> 
<EXTDESC></EXTDESC> 
<MANUF>5048</MANUF> 
<IMAGE>968-2000</IMAGE> 
</child> 
</produit> 
</produits> 

выходной Я хочу:

<produits> 
<produit ParentItem="100-9231"> 
<child> 
<ITEMCODE>100-0190</ITEMCODE> 
<DESCR>Broches Henry Schein Longueur 21Mm Taille 40</DESCR> 
<EXTDESC>Broches Henry Schein Longueur 21Mm Taille 40</EXTDESC> 
<MANUF>1</MANUF> 
<IMAGE>100-0190</IMAGE> 
</child> 
<child> 
<ITEMCODE>100-0583</ITEMCODE> 
<DESCR>Broches Henry Schein Longueur 21Mm Taille 30</DESCR> 
<EXTDESC>Broches Henry Schein Longueur 21Mm Taille 30</EXTDESC> 
<MANUF>1</MANUF> 
<IMAGE>100-0583</IMAGE> 
</child> 
<child> 
<ITEMCODE>100-0720</ITEMCODE> 
<DESCR>Broches Henry Schein Longueur 21 Mm Taille 15</DESCR> 
<EXTDESC>Broches Henry Schein Longueur 21 Mm Taille 15</EXTDESC> 
<MANUF>1</MANUF> 
<IMAGE>100-0720</IMAGE> 
</child> 
</produit> 
<produit ParentItem="968-2000"> 
<ITEMCODE>968-2000</ITEMCODE> 
<DESCR>Aiguilles Medicales Terumo</DESCR> 
<EXTDESC></EXTDESC> 
<MANUF>5048</MANUF> 
<IMAGE>968-2000</IMAGE> 
</produit> 
</produits> 
+0

Пожалуйста, объясните более четко, что вы подразумеваете под чем-то, имеющим «несколько детей». _What_ имеет более одного ребенка и что такое _child_? Кроме того, убедитесь, что ваш образец XML-ввода содержит случай, когда это условие выполнено. –

+0

ли редактировать XML, потому что я вырезать слишком много .. В моем примере Если я применить XSLT я получил что-то вроде [код] ... ... ... [/ code] Второй «продукт» получил только одного ребенка, а первый из них имеет несколько детей. Надеюсь, это более понятно ... Спасибо – Mitchum

+0

Это не делает яснее, я боюсь.Опубликуйте вывод XML, который вы фактически получаете _and_, вывод XML, который вы ожидаете. –

ответ

1

Я угадываю, что вы хотите, чтобы ваш выход выглядеть следующим образом ....

<produits> 
    <produit ParentItem="100-9231"> 
    <child> 
     <ITEMCODE>100-0190</ITEMCODE> 
     <DESCR>Broches Henry Schein Longueur 21Mm Taille 40</DESCR> 
     <EXTDESC>Broches Henry Schein Longueur 21Mm Taille 40</EXTDESC> 
     <MANUF>1</MANUF> 
     <IMAGE>100-0190</IMAGE> 
    </child> 
    <child> 
     <ITEMCODE>100-0240</ITEMCODE> 
     <DESCR>Racleurs 25Mm No40 (6)      Schein</DESCR> 
     <EXTDESC>Racleurs 25Mm No40 (6) Schein</EXTDESC> 
     <MANUF>1</MANUF> 
     <IMAGE>100-0240</IMAGE> 
    </child> 
    </produit> 
    <produit ParentItem="100-8766"> 
    <ITEMCODE>100-0379</ITEMCODE> 
    <DESCR>Finger Plugger Henry Schein 25Mm B</DESCR> 
    <EXTDESC>Pour condensation laterale de la gutta manche plastique. Rouge</EXTDESC> 
    <MANUF>1</MANUF> 
    <IMAGE>100-8766</IMAGE> 
    </produit> 
</produits> 

Первое, что нужно отметить, что ваш XSL: для-каждого может фактически использовать ключ, чтобы получить пункты «ребенок» в «группе»

<xsl:for-each select="key('produit-by-ITEMSET', ITEMSET)"> 

Чтобы избежать дублирования кода, Я хотел бы создать шаблон для вывода дочерних элементов (без ребенка элемента, хотя)

<xsl:template match="produit" mode="child"> 
    <xsl:copy-of select="ITEMCODE" /> 
    <xsl:copy-of select="DESCR" /> 
    <xsl:copy-of select="EXTDESC" /> 
    <xsl:copy-of select="MANUF" /> 
    <xsl:copy-of select="IMAGE" /> 
</xsl:template> 

Затем вы можете проверить, сколько ребенок пунктов есть путем подсчета ключа

<xsl:choose> 
     <xsl:when test="count(key('produit-by-ITEMSET', ITEMSET)) > 1"> 
      <!-- Multiple children --> 
     </xsl:when> 
     <xsl:otherwise> 
      <-- One child --> 
     </xsl:otherwise> 
    </xsl:choose> 

Для нескольких детей, используйте ток-каждый цикл, но назвать шаблон

 <xsl:for-each select="key('produit-by-ITEMSET', ITEMSET)"> 
      <child> 
       <xsl:apply-templates select="." mode="child" /> 
      </child> 
     </xsl:for-each> 

Для одиноких детей, просто вызовите шаблон, не создавая ребенок.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output indent="yes"/> 
<xsl:key name="produit-by-ITEMSET" match="produit" use="ITEMSET" /> 
    <xsl:template match="/produits"> 
    <xsl:copy> 
     <xsl:apply-templates select="*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="produit"> 
    <xsl:if test="generate-id() = generate-id(key('produit-by-ITEMSET', ITEMSET)[1])"> 
    <produit> 
     <xsl:attribute name="ParentItem"> 
      <xsl:value-of select="ITEMSET"/> 
     </xsl:attribute> 
     <xsl:choose> 
      <xsl:when test="count(key('produit-by-ITEMSET', ITEMSET)) > 1"> 
      <xsl:for-each select="key('produit-by-ITEMSET', ITEMSET)"> 
       <child> 
        <xsl:apply-templates select="." mode="child" /> 
       </child> 
      </xsl:for-each> 
      </xsl:when> 
      <xsl:otherwise> 
      <xsl:apply-templates select="." mode="child" /> 
      </xsl:otherwise> 
     </xsl:choose> 
     </produit> 
    </xsl:if> 
    </xsl:template> 

    <xsl:template match="produit" mode="child"> 
    <xsl:copy-of select="ITEMCODE" /> 
    <xsl:copy-of select="DESCR" /> 
    <xsl:copy-of select="EXTDESC" /> 
    <xsl:copy-of select="MANUF" /> 
    <xsl:copy-of select="IMAGE" /> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Спасибо, что на 100% я хочу! – Mitchum

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