首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT 1.0用于消除特定子节点类型的重复&排除其他子节点类型

XSLT 1.0用于消除特定子节点类型的重复&排除其他子节点类型
EN

Stack Overflow用户
提问于 2013-07-13 03:19:28
回答 1查看 84关注 0票数 0

我有一个XSLT问题要解决,我是个新手,这里的XSLT专家很棒,但是我找不到一个确切的解决方案来解决我的问题,我需要消除重复的书籍&在我的例子中,重复的是一个完全相同的booktype+bookname。但我不想将复制应用到任何其他节点,如CD或父节点中的任何其他节点,这些节点将保持变化,在某些示例中,我们甚至没有一个节点。如何将复制限制为仅应用于book节点。我一直试图从输入输出角度了解这一点,在这里,我可能错过了实际转换是如何发生的,任何帮助都将是非常有帮助的

已经谢谢你了!

XML:

代码语言:javascript
复制
<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>      

输出:

代码语言:javascript
复制
<?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>

所需输出:

代码语言:javascript
复制
<?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>
EN

回答 1

Stack Overflow用户

发布于 2013-07-13 03:37:44

不要忘记在ListOfBookInfo中可能出现的其他元素上应用模板。

代码语言:javascript
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17622491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档