Как найти отличные данные с помощью xpath? - PullRequest
1 голос
/ 04 марта 2012

ниже мой xml

<products>
    <product>
        <productid>1001</productid>
        <remarks>
            <title>This is remarks text of 1001</title>
        </remarks>
    </product>
    <product>
        <productid>1002</productid>
        <remarks>
            <title>This is remarks text of 1002</title>
        </remarks>
    </product>
    <product>
        <productid>1001</productid>
        <remarks>
            <title>This is remarks text of 1001</title>
        </remarks>
    </product>
    <product>
        <productid>1001</productid>
        <remarks>
            <title>This is another remarks text of 1001</title>
        </remarks>
    </product>
</products>

Мне нужно положить, как показано ниже

  1. Возьми отличное remarks/title оттуда свое productid
  2. нужно убрать отличную remark из productid 1001

    Производительность: 1001 Замечание: это текст замечаний 1001

    Производительность: 1001 Замечание: это еще один текст примечания 1001

Ответы [ 3 ]

2 голосов
/ 04 марта 2012

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

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match=
  "product
    [generate-id()
    =
     generate-id(key('kProdById', productid)[1])
    ]
  ">
  <xsl:apply-templates 
     select="key('kProdById', productid)/remarks"/>
 </xsl:template>

 <xsl:template match="remarks">
  <xsl:value-of select=
   "concat('Productid : ', ../productid,
           ' Remark:', title, '&#xA;')"/>
 </xsl:template>

 <xsl:template match="product"/>
</xsl:stylesheet>

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

<products>
    <product>
        <productid>1001</productid>
        <remarks>
            <title>This is remarks text of 1001</title>
        </remarks>
    </product>
    <product>
        <productid>1002</productid>
        <remarks>
            <title>This is remarks text of 1002</title>
        </remarks>
    </product>
    <product>
        <productid>1001</productid>
        <remarks>
            <title>This is remarks text of 1001</title>
        </remarks>
    </product>
    <product>
        <productid>1001</productid>
        <remarks>
            <title>This is another remarks text of 1001</title>
        </remarks>
    </product>
</products>

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

Productid : 1001 Remark:This is remarks text of 1001
Productid : 1001 Remark:This is remarks text of 1001
Productid : 1001 Remark:This is another remarks text of 1001
Productid : 1002 Remark:This is remarks text of 1002

Пояснение : Использование мюнхенского метода для группировки .

0 голосов
/ 04 марта 2012

с xpath 2.0 мы можем попробовать так:

distinct-values(/products/product[productid='1001']/remarks/title)
0 голосов
/ 04 марта 2012

Я бы сгруппировал идентификатор продукта и примечания вместе, используя метод Мюнхена. В сети довольно много информации о том, как это сделать.

Посмотрите, даст ли вам этот вопрос xslt-different-elements-and-grouping .

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