2012-02-10 2 views
1

아래는 내 XMLxslt1.0을 사용하여 최소값으로 구분되는 방법은 무엇입니까?

<products> 
    <product> 
     <supplier>1</supplier> 
     <item> 
      <color>Red</color> 
      <name>Pen</name> 
      <price>10</price> 
     </item> 
     <item> 
      <color>Green</color> 
      <name>Pen</name> 
      <price>15</price> 
     </item> 
     <item> 
      <color>Red</color> 
      <name>Pen</name> 
      <price>5</price> 
     </item> 
    </product> 
    <product> 
     <supplier>1</supplier> 
     <item> 
      <color>White</color> 
      <name>Pen</name> 
      <price>10</price> 
     </item> 
     <item> 
      <color>Green</color> 
      <name>Pen</name> 
      <price>18</price> 
     </item> 
     <item> 
      <color>Red</color> 
      <name>Pen</name> 
      <price>15</price> 
     </item> 
    </product> 
    <product> 
     <supplier>2</supplier> 
     <item> 
      <color>White</color> 
      <name>Pen</name> 
      <price>5</price> 
     </item> 
     <item> 
      <color>Green</color> 
      <name>Pen</name> 
      <price>18</price> 
     </item> 
     <item> 
      <color>White</color> 
      <name>Pen</name> 
      <price>15</price> 
     </item> 
    </product> 
</products> 
내가 XSLT 1.0

를 사용하여 ...이 최소 가격으로 별개의 제품을 취할 필요

입니다

필요한 출력은

<products> 
    <product> 
     <supplier>1</supplier> 
     <item> 
      <color>Green</color> 
      <name>Pen</name> 
      <price>15</price> 
     </item> 
     <item> 
      <color>Red</color> 
      <name>Pen</name> 
      <price>5</price> 
     </item> 
     <item> 
      <color>White</color> 
      <name>Pen</name> 
      <price>10</price> 
     </item> 
    </product> 
    <product> 
     <supplier>2</supplier> 
     <item> 
      <color>White</color> 
      <name>Pen</name> 
      <price>5</price> 
     </item> 
     <item> 
      <color>Green</color> 
      <name>Pen</name> 
      <price>18</price> 
     </item> 
    </product> 
</products> 

당신의 도움을 기대하고 ---- -------------------------------------------------- ---------- --------------------------------------- - -------------------------------------------------- ----------------- - - ------------------------------

답변

0

사용 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:key name="s" match="product" use="supplier"/> 
    <xsl:key name="k" match="item" use="concat(../supplier, ',', name, ',', color)"/> 

    <xsl:template match="/products"> 
    <xsl:copy> 
     <xsl:apply-templates select="product[generate-id() 
          = generate-id(key('s', supplier))]"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="product"> 
    <xsl:copy> 
     <xsl:copy-of select="supplier"/> 
     <xsl:apply-templates select="../product/item[generate-id() 
          = generate-id(key('k', concat(current()/supplier, ',', name, ',', color)))]"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="item"> 
    <xsl:for-each select="key('k', concat(../supplier, ',', name, ',', color))"> 
     <xsl:sort select="price" data-type="number"/> 
     <xsl:if test="position() = 1"> 
     <xsl:copy-of select="."/> 
     </xsl:if> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 
+0

효과가 있지만 그 이유는 알 수 없습니다. '[1]'을'key()'다음에 쓰지는 않지만 여전히 중복을 생성하지는 않습니다. 테스트 한 모든 XSLT 엔진에서 동일합니다. –

+0

@MizardX,'generate-id' 함수는 전달 된 노드 집합의 첫 번째 요소를 사용합니다. 따라서 술어를 지정할 필요가 없습니다. –

관련 문제