2010-08-04 2 views
3

Как найти все отдельные имена в моем XML с помощью XSL?Получить отдельные значения узлов в XML с помощью XSL

<NewDataSet> 
    <SearchResult> 
    <Name>HAREDIN </Name> 
    <Surname>FEIMI</Surname> 
    <FathersName>QAMIL</FathersName> 
    <Birthdate>1949-06-13T00:00:00+02:00</Birthdate> 
    <CustomerSegment>Individe Standart </CustomerSegment> 
    </SearchResult> 
    <SearchResult> 
    <Name>HARMENAK</Name> 
    <Surname>BADEJAN</Surname> 
    <FathersName>VARAHAN </FathersName> 
    <Birthdate>1943-10-02T00:00:00+02:00</Birthdate> 
    <CustomerSegment>Individe Standart </CustomerSegment> 
    </SearchResult> 
    <SearchResult> 
    <Name>HARMENAK</Name> 
    <Surname>BADEJAN</Surname> 
    <FathersName>VARAHAN </FathersName> 
    <Birthdate>1943-10-02T00:00:00+02:00</Birthdate> 
    <CustomerSegment>Individe Standart </CustomerSegment> 
    </SearchResult> 
</NewDataSet> 

Я не буду все отчетливое узел имя, го выхода, как thse:

<root> 

<Name>HAREDIN </Name> 

<Name>HARMENAK</Name> 

</root> 
+2

Пожалуйста, покажите, что XSL-код у вас есть до сих пор. Существует множество примеров универсальных «получить отдельные значения в XSL» -решениях даже здесь, на этом сайте. Наверняка достаточно, чтобы вы начали. http://stackoverflow.com/search?q=[xslt]+distinct – Tomalak

+0

Можете ли вы опубликовать образец желаемого результата? –

+0

выход: HARMENAK HAREDIN

ответ

11

Это XSLT 1.0 Преобразование:

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

<xsl:key name="kNamesByVal" match="Name" use="."/> 

<xsl:template match="/"> 
    <t> 
    <xsl:copy-of select= 
    "*/*/Name[generate-id() 
      = 
       generate-id(key('kNamesByVal', .)[1]) 
       ] 
    "/> 
    </t> 
</xsl:template> 
</xsl:stylesheet> 

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

<t> 
    <Name>HAREDIN </Name> 
    <Name>HARMENAK</Name> 
</t> 

XSLT 2.0 решение, который не использует ключи:

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

<xsl:template match="/"> 
    <t> 
    <xsl:for-each-group select="*/*/Name" group-by="."> 
    <xsl:copy-of select="."/> 
    </xsl:for-each-group> 
    </t> 
</xsl:template> 
</xsl:stylesheet> 
+0

Вы читаете мой разум, хорошее решение! –

+2

+1 для решения XSLT 2.0 – 2010-08-04 14:14:39

+0

Предположим, вы хотите префикс вывода с номерами, указывающими, что они собой представляют. Например: «# 1 - Haredin», затем «# 2 - Harmenak». Знаете ли вы, как это сделать в XSLT 1.0? – NessDan

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