2015-05-18 2 views
0

Это входной XML-адрес.Нужна помощь в преобразовании XSLT

<catalog> 
    <product> 
     <product_id>1234</product_id> 
     <categories> 
      <category> 
       <category_id>frame-shape_oval</category_id> 
       <category_name>frame-shape_oval</category_name> 
      </category> 
      <category> 
       <category_id>frame-shape_square</category_id> 
       <category_name>frame-shape_square</category_name> 
      </category> 
      <category> 
       <category_id>frame-color_tortoise</category_id> 
       <category_name>frame-color_tortoise</category_name> 
      </category> 
      <category> 
       <category_id>face-shape_oval</category_id> 
       <category_name>face-shape_oval</category_name> 
      </category> 
      <category> 
       <category_id>face-shape_square</category_id> 
       <category_name>face-shape_square</category_name> 
      </category> 
      <category> 
       <category_id>gender_men</category_id> 
       <category_name>gender_men</category_name> 
      </category> 
      <category> 
       <category_id>lens-color_gold rose</category_id> 
       <category_name>lens-color_gold rose</category_name> 
      </category> 
      <category> 
       <category_id>fit_average</category_id> 
       <category_name>fit_average</category_name> 
      </category> 
     </categories> 
    </product> 
</catalog> 

Это ожидаемое преобразование

<catalog> 
    <product> 
     <product_id>1234</product_id> 
     <frame_shape>oval,square</frame_shape> 
     <frame_color>tortoise</frame_color> 
     <face_shape>oval,square</face_shape> 
     <gender>men</gender> 
     <lens_color>gold rose</lens_color> 
     <fit>average</fit> 
    </product> 
</catalog> 

Возможно ли это с помощью преобразования XSLT?

  1. Преобразующее значение элемента как имя элемента. Например: <category_id>frame-shape_oval</category_id> становится <frame_shape>oval</frame_shape>. Таким образом, текст перед подчеркиванием становится именем элемента и текстом после того, как подчеркивание становится значением элемента.
  2. Обратите внимание, что элемент <category_id> рамочная форма и цвет рамки повторяются для <product>, но имеют разные значения в <category_name>. Значения объединены запятой.
+0

Просьба указать, можете ли вы использовать XSLT 2.0 или только 1.0. –

+0

Это будет XSLT 1.0 – Sarang

+0

@Sarang http://stackoverflow.com/help/someone-answers –

ответ

-1

Вы можете попробовать следующее решение. Обратите внимание, что я использовал node-set() microsoft для преобразования содержимого переменной «temp» в набор узлов.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
           xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
           exclude-result-prefixes="msxsl"> 
     <xsl:template match="/*"> 
     <catalog> 
      <xsl:for-each select="product"> 
      <product> 
       <xsl:copy-of select="product_id"/> 
       <xsl:variable name="temp"> 
       <xsl:for-each select="categories/category//category_id"> 
        <xsl:element name="{substring-before(.,'_')}"> 
        <xsl:value-of select="substring-after(.,'_')"/> 
        </xsl:element> 
       </xsl:for-each> 
       </xsl:variable> 
       <xsl:for-each select="msxsl:node-set($temp)/*"> 
       <xsl:variable name="curName" select="local-name(.)"/> 
       <xsl:choose> 
        <xsl:when test="(count(following-sibling::*[local-name()=$curName]) &gt; 0) and (count(preceding-sibling::*[local-name()=$curName]) = 0)"> 
        <xsl:element name="{$curName}"> 
         <xsl:value-of select="."/> 
         <xsl:for-each select="following-sibling::*[local-name()=$curName]"> 
         ,<xsl:value-of select="."/> 
         </xsl:for-each> 
        </xsl:element> 
        </xsl:when> 
        <xsl:when test="(count(following-sibling::*[local-name()=$curName]) = 0) and (count(preceding-sibling::*[local-name()=$curName]) = 0)"> 
        <xsl:element name="{$curName}"> 
         <xsl:value-of select="."/> 
        </xsl:element> 
        </xsl:when> 
       </xsl:choose> 
       </xsl:for-each> 
      </product> 
      </xsl:for-each> 
     </catalog> 
     </xsl:template> 
</xsl:stylesheet> 
0

Первая проблема довольно тривиальна, и может быть обработан:

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="*"/> 

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

<xsl:template match="category"> 
    <xsl:element name="{substring-before(category_id, '_')}"> 
     <xsl:value-of select="substring-after(category_id, '_')"/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

Заметим, что это предполагает подстроку, прежде чем подчеркивание в category_id всегда будет действительным Имя элемента XML.

Для второй проблемы см. http://www.jenitennison.com/xslt/grouping/muenchian.html и многие, многие примеры Muenchian группировки здесь на SO.

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