2010-03-31 1 views
1

У меня есть XML, как,Проблема в использовании XPath с XSLT, имеющих различные значения

<items> 
    <item> 
    <products> 
     <product>laptop</product> 
     <product>charger</product> 
     <product>Cam</product> 
    </products> 
    </item> 
    <item> 
    <products> 
     <product>laptop</product> 
     <product>headphones</product> 
     <product>Photoframe</product> 
    </products> 
    </item> 
    <item> 
    <products> 
     <product>laptop</product> 
     <product>charger</product> 
     <product>Battery</product> 
    </products> 
    </item> 
</items> 

и я использую XSLT на нем

// не может изменить XPath, как получить его где-то еще

<xsl:param name="xparameter" select="items/item[products/product='laptop' and products/product='charger']"></xsl:param> 

    <xsl:template match="/"> 

     <xsl:for-each select="$xparameter"> 

      <xsl:for-each select="products/product[not(.=preceding::product)]"> 
       <xsl:sort select="."></xsl:sort> 
       <xsl:value-of select="." ></xsl:value-of>, 
      </xsl:for-each> 

      </xsl:for-each> 

    </xsl:template> 

Я хочу выход быть

laptop 
charger 
cam 
Battery 

Но я не получаю результат, поскольку ожидаю ... отличные значения работают нормально .. что-то не получается, когда я добавляю это, и claus

+0

Примечание: Я проверил xpath отдельно и также работает gud ... но я не знаю, как объединить эти два ... –

+0

Хороший вопрос (+1). См. Решение ниже. :) –

ответ

0

Вам необходимо отсортировать все узлы в наборе узлов - они не являются братьями и сестрами вообще.

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

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:param name="xparameter" select="items/item[products/product='laptop' and products/product='charger']"></xsl:param> 

    <xsl:template match="/"> 
    <xsl:for-each select="$xparameter/products/product"> 
    <xsl:variable name="vPos" select="position()"/> 
    <xsl:if test="not(. = ($xparameter/products/product)[position() > $vPos])"> 
     <xsl:value-of select="concat(., ',')"/> 
    </xsl:if> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

при нанесении на предоставленном документе XML, производит отчетливый список значений:

Cam,laptop,charger,Battery, 

Вам нужен еще пройти, чтобы отсортировать их в требуемый порядок и исключить конечную запятую.

+0

Большое спасибо ... –

Смежные вопросы