как взять разные с минимальным значением, используя xslt1.0? - PullRequest
1 голос
/ 10 февраля 2012

Ниже приведен мой xml-файл с именем product.xml

<products>
    <product>
        <name>Pen</name>
        <price>8</price>
    </product> 
    <product>
        <name>Bag</name>
        <price>10</price>
    </product>
    <product>
        <name>Pen</name>
        <price>10</price>
    </product>
    <product>
        <name>Pen</name>
        <price>5</price>
    </product>
    <product>
        <name>Bag</name>
        <price>15</price>
    </product>
    <product>
        <name>Pencil</name>
        <price>5</price>
    </product>
    </products>

Мне нужно взять отдельный продукт с минимальной ценой ... используя xslt 1.0

требуемый вывод

<products>
<product>
    <name>Bag</name>
    <price>10</price>
</product>
<product>
    <name>Pen</name>
    <price>5</price>
</product>
<product>
    <name>Pencil</name>
    <price>5</price>
</product>
<products>

в надежде на вашу помощь ---------------------------------------------------------------- --------------------------------------- - ------------------------------------------------------------------- - - ------------------------------

1 Ответ

0 голосов
/ 10 февраля 2012

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kProdByName" match="product"
           use="name"/>

 <xsl:template match=
  "product
    [generate-id()
    =
     generate-id(key('kProdByName', name)[1])
     ]
  ">
   <product>
    <xsl:for-each select="key('kProdByName', name)">
      <xsl:sort select="price" data-type="number"/>

      <xsl:if test="position() = 1">
        <xsl:copy-of select="node()"/>
      </xsl:if>
    </xsl:for-each>
   </product>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<products>
    <product>
        <name>Pen</name>
        <price>8</price>
    </product>
    <product>
        <name>Bag</name>
        <price>10</price>
    </product>
    <product>
        <name>Pen</name>
        <price>10</price>
    </product>
    <product>
        <name>Pen</name>
        <price>5</price>
    </product>
    <product>
        <name>Bag</name>
        <price>15</price>
    </product>
    <product>
        <name>Pencil</name>
        <price>5</price>
    </product>
</products>

дает желаемый, правильный результат :

<product>
  <name>Pen</name>
  <price>5</price>
</product>
<product>
  <name>Bag</name>
  <price>10</price>
</product>
<product>
  <name>Pencil</name>
  <price>5</price>
</product>

Объяснение

  1. мюнхенская группировка product по name.

  2. В каждой группе найти product с минимальным price, взяв первое product из отсортированного по группам списка узлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...