我有一个 XSLT 问题要解决,我对 XSLT 还很陌生,这里的 XSLT 专家很棒,但是我找不到我的问题的确切解决方案,我需要消除重复的书籍,并且在我的情况下重复是一个确切的书籍类型+书名。但我不想将复制应用到任何其他节点,如 CD 或父节点中的任何其他节点,节点会不断变化,在某些示例中,我们甚至没有单个节点。我将如何限制复制仅应用于书节点。我一直试图从输入输出的角度来学习这一点,我可能会错过实际的转换是如何发生的,任何帮助都会有很大的帮助
已经谢谢了!
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>