2013-04-11 47 views
-1

我有一個XML文件:如何在XSL中爲每個節點選擇具有相同名稱的節點?

<PRODUCTS> 
    <PRODUCT> 
    <NAME_EN>jacket</NAME_EN> 
    <SKU>1</SKU> 
    <SIZE> 
     <CODE>01 </CODE> 
     <DESCRIPTION>34</DESCRIPTION> 
    </SIZE> 
    <COLOR> 
     <DESCRIPTION_EN>black</DESCRIPTION_EN> 
    </COLOR> 
    </PRODUCT> 
    <PRODUCT> 
    <NAME_EN>jacket</NAME_EN> 
    <SKU>2</SKU> 
    <SIZE> 
     <CODE>02</CODE> 
     <DESCRIPTION>35</DESCRIPTION> 
    </SIZE> 
    <COLOR> 
     <DESCRIPTION_EN>black</DESCRIPTION_EN> 
    </COLOR> 
    </PRODUCT> 
    <PRODUCT> 
    <NAME_EN>shoes</NAME_EN> 
    <SKU>3</SKU> 
    <SIZE> 
     <CODE>01</CODE> 
     <DESCRIPTION>34</DESCRIPTION> 
    </SIZE> 
    <COLOR> 
     <DESCRIPTION_EN>black</DESCRIPTION_EN> 
    </COLOR> 
    </PRODUCT> 
</PRODUCTS> 

我想使用XSL轉換來實現這樣的結果:

<catalog> 
    <product> 
    <variants> 
     <variant> 
     <sku>1</sku>   
     <options> 
      <option> 
      <code>size</code> 
      <value>34</value> 
      </option> 
     </options> 
     </variant> 
     <variant> 
     <sku>2</sku>   
     <options> 
      <option> 
      <code>size</code> 
      <value>35</value> 
      </option> 
     </options> 
     </variant> 
    </variants> 
    </product> 
    <product> 
    <variants> 
     <variant> 
     <sku>3</sku>   
     <options> 
      <option> 
      <code>size</code> 
      <value>34</value> 
      </option> 
     </options> 
     </variant> 
    </variants> 
    </product> 
</catalog> 

我需要的是爲-每過的所有節點,其中NAME_ENCOLOR/DESCRIPTION_EN其中name一樣。

我知道這樣的for-each:

<xsl:for-each select="PRODUCTS/PRODUCT[NAME_EN='jacket']"> 

但它不會叉我。 有什麼辦法可以做到這一點?

+0

我不明白你的 '其中' 條款。你想要NAME_EN == COLOR/DESCRIPTION_EN的節點嗎? – Efrain 2013-04-11 10:04:10

+0

不,一個節點集NAME_EN ==夾克和COLOR/DESCRIPTION_EN ==藍色,下一個NAME_EN ==夾克和COLOR/DESCRIPTION_EN ==白色,下一個是NAME_EN == shoes和COLOR/DESCRIPTION_EN == green – 2013-04-11 10:06:32

+1

嗯。查看,我認爲這對你有用。 – Efrain 2013-04-11 10:16:05

回答

1

下面是使用XSLT 1.0和Muenchian方法組產品由NAME_EN字段的值的解決方案。

<?xml version="1.0" encoding="UTF-8"?> 
<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="product-by-name" match="PRODUCT" use="NAME_EN"/> 

    <xsl:template match="/PRODUCTS"> 
     <products> 
      <xsl:apply-templates select="PRODUCT"/> 
     </products> 
    </xsl:template> 

    <xsl:template match="PRODUCT"> 
     <xsl:variable name="name-group" select="key('product-by-name', NAME_EN)"/> 
     <xsl:if test="generate-id() = generate-id($name-group[1])"> 
      <product> 
       <variants> 
        <xsl:for-each select="$name-group"> 
         <variant> 
          <xsl:apply-templates select="SKU"/> 
          <options> 
           <xsl:apply-templates select="SIZE"/> 
          </options> 
         </variant> 
        </xsl:for-each> 
       </variants> 
      </product> 
     </xsl:if> 
    </xsl:template> 

    <xsl:template match="SKU"> 
     <sku><xsl:value-of select="."/></sku> 
    </xsl:template> 

    <xsl:template match="SIZE"> 
     <option> 
      <code>size</code> 
      <value><xsl:value-of select="DESCRIPTION"/></value> 
     </option> 
    </xsl:template> 

</xsl:stylesheet> 

輸出

<products> 
    <product> 
     <variants> 
     <variant> 
      <sku>1</sku> 
      <options> 
       <option> 
        <code>size</code> 
        <value>34</value> 
       </option> 
      </options> 
     </variant> 
     <variant> 
      <sku>2</sku> 
      <options> 
       <option> 
        <code>size</code> 
        <value>35</value> 
       </option> 
      </options> 
     </variant> 
     </variants> 
    </product> 
    <product> 
     <variants> 
     <variant> 
      <sku>3</sku> 
      <options> 
       <option> 
        <code>size</code> 
        <value>34</value> 
       </option> 
      </options> 
     </variant> 
     </variants> 
    </product> 
</products> 
0

下面是完整的解決方案:

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

    <xsl:template match="NAME_EN | DESCRIPTION_EN"/> 

    <xsl:template match="/"> 
    <catalog> 
     <xsl:call-template name="product"/> 
    </catalog> 
    </xsl:template> 


    <xsl:template name="product"> 
    <xsl:for-each-group select="//NAME_EN" group-by="text()"> 
     <xsl:for-each select="current-grouping-key()"> 
     <product> 
      <variants> 
      <xsl:for-each select="current-group()/parent::PRODUCT"> 
       <variant> 
       <xsl:apply-templates/> 
       </variant> 
      </xsl:for-each> 
      </variants> 
     </product> 
     </xsl:for-each> 
    </xsl:for-each-group> 
    </xsl:template> 

    <xsl:template match="SKU"> 
    <sku> 
     <xsl:apply-templates/> 
    </sku> 
    </xsl:template> 

    <xsl:template match="SIZE"> 
    <options> 
     <option> 
     <xsl:apply-templates/> 
     </option> 
    </options> 
    </xsl:template> 

    <xsl:template match="CODE"> 
    <code> 
     <xsl:apply-templates/> 
    </code> 
    </xsl:template> 

    <xsl:template match="DESCRIPTION"> 
    <value> 
     <xsl:apply-templates/> 
    </value> 
    </xsl:template> 
</xsl:stylesheet> 
相關問題