2015-05-18 110 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()將「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上分組的許多例子。