如果您对如何使用Muenchian Grouping实现此操作感兴趣,那么您首先需要定义一个“键”来识别行内重复的书籍。这是XSLT中常用的技术之一。
<xsl:key
name="books"
match="book"
use="concat(concat(../../Row_ID, '#'), concat(concat(BookType, '#'), BookName))" />
我使用连接键RowID、BookType和BookName来实现这一点。该键将包含一个书籍列表,所有这些书籍都具有该特定键值。请注意,使用#字符作为连接字符。如果您的XML中有任何可能出现#的情况,您需要选择另一个字符(或字符串)。
现在,当您匹配book元素时,可以像这样检查重复项
<xsl:variable
name="lookup"
select="concat(concat(../../Row_ID, '#'), concat(concat(BookType, '#'), BookName))" />
<xsl:if test="generate-id() = generate-id(key('books', $lookup)[1])">
换句话说,这个
书元素是我们关键字中的第一个元素吗?
以下是完整的XSLT。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key
name="books"
match="book"
use="concat(concat(../../Row_ID, '#'), concat(concat(BookType, '#'), BookName))"/>
<xsl:template match="book">
<xsl:variable name="lookup" select="concat(concat(../../Row_ID, '#'), concat(concat(BookType, '#'), BookName))"/>
<xsl:if test="generate-id() = generate-id(key('books', $lookup)[1])">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
还要注意使用身份转换,以便可以复制其他节点而无需显式引用它们。当将此XSLT应用于您的输入时,将生成以下输出:
<RowIDWithListOfBooks xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/">
<Row_ID>ADOA-XssK</Row_ID>
<ListOfBookInfo>
<book>
<BookType>Brand</BookType>
<BookName>jon</BookName>
</book>
</ListOfBookInfo>
</RowIDWithListOfBooks>
编辑:我已经修改了XSLT,删除了一个不必要的模板匹配。
xsl:include
。这样,即使对于不知道恒等转换是什么的人,你的样式表也能正常工作。 - Daniel Haleyxsl:include
的作用;-)我已经附上了一条带有参考文献的注释。感谢您的反馈。 - Emiliano Poggi