首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用两个不同的XML文件作为源时进行分组?

当使用两个不同的XML文件作为源时进行分组?
EN

Stack Overflow用户
提问于 2011-11-30 17:40:36
回答 2查看 140关注 0票数 1

我想做的是一个典型的分组,通常可以使用xsl:key完成,但由于分组的数据位于两个不同的文件中,因此它变得更加复杂。如何处理?这是我想做的一个例子,我可以请求你的帮助吗?必须符合xslt-1.0。

bookreference.xml:

代码语言:javascript
复制
<t>  
    <book isbn="1">  
        <category>SF</category>  
    </book>  
    <book isbn="2">  
        <category>SF</category>  
    </book>  
    <book isbn="3">  
        <category>SF</category>  
    </book>  
    <book isbn="4">  
        <category>Comedy</category>  
    </book>  
    <book isbn="5">  
        <category>Comedy</category>  
    </book>
</t>  

mylibrary.xml:

代码语言:javascript
复制
<t>  
   <book isbn="1">
       <price>10</price>
   </book>
   <book isbn="2">
      <price>10</price>
   </book>       
   <book isbn="3">
      <price>20</price>
   </book>
   <book isbn="4">
      <price>5</price>
   </book>
</t>  

想要的输出:

代码语言:javascript
复制
SF : 3 book(s) - Total : 40$
Comedy : 2 book(s) - Total : 5$
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-30 20:51:39

正如我在评论中所建议的,您可以首先将两个文档合并为一个结果树片段,然后使用exsl:node-set获得一个节点集,然后可以对其应用Muenchian分组:

代码语言:javascript
复制
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exsl="http://exslt.org/common"
  exclude-result-prefixes="exsl"
  version="1.0">

  <xsl:param name="price-url" select="'test2011113002.xml'"/>
  <xsl:variable name="doc2" select="document($price-url)"/>

  <xsl:output method="text"/>

  <xsl:variable name="rtf">
    <xsl:apply-templates select="//book" mode="merge"/>
  </xsl:variable>

  <xsl:template match="book" mode="merge">
    <xsl:copy>
      <xsl:variable name="isbn" select="@isbn"/>
      <xsl:copy-of select="@* | node()"/>
      <xsl:for-each select="$doc2">
        <xsl:copy-of select="key('k1', $isbn)/price"/>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>

  <xsl:key name="k1" match="book" use="@isbn"/>
  <xsl:key name="k2" match="book" use="category"/>

  <xsl:template match="/">
    <xsl:apply-templates select="exsl:node-set($rtf)/book[generate-id() = generate-id(key('k2', category)[1])]"/>
  </xsl:template>

  <xsl:template match="book">
    <xsl:variable name="current-group" select="key('k2', category)"/>
    <xsl:value-of select="concat($current-group/category, ': ', count($current-group), ' - Total : ', sum($current-group/price), '&#10;')"/>
  </xsl:template>

</xsl:stylesheet>
票数 0
EN

Stack Overflow用户

发布于 2011-11-30 21:49:12

问得好,+1。

对于复杂的(超过必要的)分组或任何扩展功能,没有需求

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kBookByCat" match="book"
      use="category"/>

 <xsl:key name="kPriceByIsbn" match="price"
      use="../@isbn"/>

 <xsl:variable name="vMyLib" select=
 "document('file:///c:/temp/delete/mylibrary.xml')"/>

 <xsl:template match=
  "book[generate-id()
       =
        generate-id(key('kBookByCat', category)[1])
        ]
  ">
     <xsl:variable name="vBooksinCat" select=
          "key('kBookByCat', category)"/>

     <xsl:value-of select="category"/> : <xsl:text/>
     <xsl:value-of select="count($vBooksinCat)"/>
     <xsl:text> book(s) - Total : $</xsl:text>

     <xsl:for-each select="$vMyLib">
      <xsl:value-of select="sum(key('kPriceByIsbn', $vBooksinCat/@isbn))"/>
      <xsl:text>&#xA;</xsl:text>
     </xsl:for-each>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

当对所提供的两个数据片段中的第一个应用此转换时(更正为格式良好的文档):

代码语言:javascript
复制
<t>
    <book isbn="1">
        <category>SF</category>
    </book>
    <book isbn="2">
        <category>SF</category>
    </book>
    <book isbn="3">
        <category>SF</category>
    </book>
    <book isbn="4">
        <category>Comedy</category>
    </book>
    <book isbn="5">
        <category>Comedy</category>
    </book>
</t>

并将第二数据片段(校正为格式良好的XML文档)保存为C:\Temp\Delete\mylibrary.xml

生成所需的正确结果

代码语言:javascript
复制
SF : 3 book(s) - Total : $40
Comedy : 2 book(s) - Total : $5
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8323823

复制
相关文章

相似问题

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