2013-09-11 4 views
0

Есть ли простой способ получить следующий код, чтобы показывать только отдельные значения?XSLT 1 отображает различные значения

<xsl:template match="/"> 
    <xsl:for-each select="NewDataSet/Vehicle"> 
     <xsl:value-of select="ManufacturerName" /> 
    </xsl:for-each> 

<!-- Does a load of other stuff down here --> 

</xsl:template> 

Это, по сути, что XML выглядит следующим образом:

<NewDataSet> 
    <Vehicle> 
    <ManufacturerName>FORD</ManufacturerName> 
    </Vehicle> 
    <Vehicle> 
    <ManufacturerName>CHEVROLET</ManufacturerName> 
    </Vehicle> 
    <Vehicle> 
    <ManufacturerName>VAUXHALL</ManufacturerName> 
    </Vehicle> 
    <Vehicle> 
    <ManufacturerName>VAUXHALL</ManufacturerName> 
    </Vehicle> 
    <Vehicle> 
    <ManufacturerName>VAUXHALL</ManufacturerName> 
    </Vehicle> 
</NewDataSet> 

Спасибо.

+0

Отличные значения чего? Можете ли вы показать пример вашего входного XML? –

+0

Извините. Я исправил свой оригинальный пост. –

+0

Возможный дубликат [Как использовать XSLT для создания отдельных значений] (http://stackoverflow.com/questions/2291567/how-to-use-xslt-to-create-distinct-values) –

ответ

4

Чтобы получить отличные значения, наиболее эффективным способом является, как правило, использование метода, называемого Muenchian Grouping. На самом деле вы не можете получить все транспортные средства в группе, но чтобы получить отличные значения, вы фактически получаете первый элемент в каждой группе.

Для этого необходимо определить ключ, чтобы посмотреть вверх Vehicle элементы по ManufacturerName

<xsl:key name="Manufacturer" match="Vehicle" use="ManufacturerName" /> 

Затем, чтобы получить различные значения, вы перебрать все ее транспортное средство элементов, и выбрать тот, который происходит первый в ключе для данной ее ManufacturerName

<xsl:for-each select="Vehicle 
       [generate-id() = generate-id(key('Manufacturer', ManufacturerName)[1])]"> 

Попробуйте XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:key name="Manufacturer" match="Vehicle" use="ManufacturerName" /> 

    <xsl:template match="/*"> 
    <xsl:for-each select="Vehicle[generate-id() = generate-id(key('Manufacturer', ManufacturerName)[1])]"> 
     <xsl:value-of select="ManufacturerName"/> 
    </xsl:for-each> 
    <!-- Does a load of other stuff down here --> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Thank. Просто работа. –

1

Это таблицы стилей XSLT:

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

    <xsl:template match="NewDataSet"> 
    <xsl:apply-templates select="Vehicle[not(ManufacturerName=preceding-sibling::Vehicle/ManufacturerName)]"/> 
    </xsl:template> 

    <xsl:template match="Vehicle"> 
    <xsl:value-of select="ManufacturerName"/> 
    <xsl:text>&#xa;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

производит следующий вывод применительно к вашему примеру XML:

FORD 
CHEVROLET 
VAUXHALL 

важная часть находится в xsl:apply-templatesselect. Он работает только путем выбора Vehicle элементов, Manufacturer не появился в одном из предыдущих элементов Vehicle на том же уровне.

+0

Извините, это полностью мое для упрощения кода. У меня проблемы, и это связано с отсутствием знаний в отношении XSL. Мой xslt выполняет нагрузку другого материала, поэтому отдельный список нужно ассимилировать изнутри шаблона. Я снова поправил свой оригинальный пост, чтобы попытаться описать, что я имею в виду. Сожалею. –

0

Это должно быть самым простым способом, чтобы показать различные значения ... (The <xsl:text>&#xa;</xsl:text> только для отображения новых линий).

XSL

<xsl:template match="/"> 
    <xsl:for-each select="//ManufacturerName[not(.=preceding::*)]"> 
     <xsl:value-of select="." /><xsl:text>&#xa;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 

Результат

FORD 
CHEVROLET 
VAUXHALL 

information here Больше.

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