2013-07-12 2 views
0

У меня проблема с XSLT для решения, довольно новая для XSLT, эксперты XSLT здесь потрясающие, но я не мог найти точного решения для моего проблема, мне нужно удалить дубликаты книг &, дубликат в моем случае - это точный тип книги + имя книги. но я не хочу применять дублирование для любых других узлов, таких как CD или любые другие узлы в родительском узле, узлы будут меняться, в некоторых примерах мы даже не имеем одного узла. Как я ограничу дублирование, которое будет применено только к узлу книги. Я пытался узнать это из предложения ввода здесь, я могу пропустить, как происходит фактическое преобразование, любая помощь будет отличной помощьюXSLT 1.0 для устранения дубликатов для определенного типа дочернего узла & для исключения других

Спасибо уже !

XML:

<ListOfRowIDWithListOfBooks xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/"> 
    <RowIDWithListOfBooks> 
    <ListOfBookInfo> 
     <book> 
     <BookType>Brand</BookType> 
     <BookName>jon</BookName> 
     </book> 
     <book> 
     <BookType>Brand</BookType> 
     <BookName>jon</BookName> 
     </book> 
     <CD> 
     <CDType>Country</CDType> 
     <CDName>MaxStar</CDName> 
     </CD> 
    </ListOfBookInfo> 
    </RowIDWithListOfBooks> 
</ListOfRowIDWithListOfBooks> 

XSLT: I have developed so far, Dimitre, thanks much sir! u have been a great help 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <!--Key--> 
    <xsl:key name="k-books" match="book" use="concat(BookType,'|',BookName)"/> 
    <!--Global match template--> 
    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 
    <!--Eliminate duplicate book nodes template--> 
    <xsl:template match="ListOfBookInfo"> 
      <xsl:copy> 
       <xsl:apply-templates select="book 
       [generate-id() 
       =generate-id(key('k-books',concat(BookType,'|',BookName))[1])]"/> 
      </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet>  

Выход:

<?xml version="1.0"?> 
<ListOfRowIDWithListOfBooks xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/"> 
<RowIDWithListOfBooks> 
<ListOfBookInfo><book> 
<BookType>Brand</BookType> 
<BookName>jon</BookName> 
</book></ListOfBookInfo> 
</RowIDWithListOfBooks> 
</ListOfRowIDWithListOfBooks> 

Желаемая Выход:

<?xml version="1.0"?> 
<ListOfRowIDWithListOfBooks xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/"> 
<RowIDWithListOfBooks> 
<ListOfBookInfo> 
<book> 
<BookType>Brand</BookType> 
<BookName>jon</BookName> 
</book> 
<CD> 
<CDType>Country</CDType> 
<CDName>MaxStar</CDName> 
</CD> 
</ListOfBookInfo> 
</RowIDWithListOfBooks> 
</ListOfRowIDWithListOfBooks> 

ответ

1

Вы не должны забывать применять шаблоны на другие элементы, которые могут возникнуть в ListOfBookInfo.

<xsl:template match="ListOfBookInfo"> 
    <xsl:copy> 
     <xsl:apply-templates select="book 
      [generate-id() 
      =generate-id(key('k-books',concat(BookType,'|',BookName))[1])]"/> 
     <!-- Apply templates for other element than book --> 
     <xsl:apply-templates select="@* | node()[name() != 'book']" /> 

    </xsl:copy> 
</xsl:template> 
+0

спасибо, Jirka, работал отлично! –

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