-2

私はxmlファイルを持っています:

<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>

私が必要とするのは、同じ名前のすべてのノードに対して for-each を実行することNAME_ENですCOLOR/DESCRIPTION_EN

私はそのようなfor-eachについて知っています:

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

しかし、それは私のために分岐しません。これを達成する方法はありますか?

4

3 に答える 3

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>
于 2013-04-11T13:49:13.313 に答える