簡體   English   中英

通過xsl根據xml對數據進行分組

[英]Grouping data based on a xml through xsl

我正在尋找通過XSLT 1.0將數據分組到xml中的方法,請有人提出一種實現方法。

<product>
  <group>
    <groupName>Maruthi</groupName>
    <groupOrderNumber>1</groupOrderNumber>
        <metaData>
          <metaDataName>sequenceOrderNumber</metaDataName>
          <metaDataValue>1</metaDataValue>             
       </metaData>
       <metaData>
          <metaDataName>HeaderName</metaDataName>
          <metaDataValue>Maruthi 800</metaDataValue>           
       </metaData>
  </group>
  <group>
    <groupName>Maruthi</groupName>
    <groupOrderNumber>1</groupOrderNumber>
        <metaData>
          <metaDataName>sequenceOrderNumber</metaDataName>
          <metaDataValue>2</metaDataValue>             
       </metaData>
       <metaData>
          <metaDataName>HeaderName</metaDataName>
          <metaDataValue>Maruthi Alto</metaDataValue>           
       </metaData>
  </group>
  <group>
    <groupName>Honda</groupName>
    <groupOrderNumber>2</groupOrderNumber>
        <metaData>
          <metaDataName>sequenceOrderNumber</metaDataName>
          <metaDataValue>1</metaDataValue>             
       </metaData>
       <metaData>
          <metaDataName>HeaderName</metaDataName>
          <metaDataValue>Honda City</metaDataValue>           
       </metaData>
  </group>
  <group>
    <groupName>Honda</groupName>
    <groupOrderNumber>2</groupOrderNumber>
        <metaData>
          <metaDataName>sequenceOrderNumber</metaDataName>
          <metaDataValue>2</metaDataValue>             
       </metaData>
       <metaData>
          <metaDataName>HeaderName</metaDataName>
          <metaDataValue>Honda Amaze</metaDataValue>           
       </metaData>
  </group>
</product>

我要顯示以下內容,制造商訂單基於組訂單號,模型訂單基於sequenceOrderNumber。

Manufacturer: Maruthi
        Model: Maruthi800
        Model: Maruthi Alto
 Manufacturer: Honda
        Model: Honda City
        Model: Honda Amaze

請找到可以對數據進行分組的樣式表,請根據序列號建議如何訂購。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:nms="http://www.example.org/consolidated"
 exclude-result-prefixes="nms"> 
<xsl:output method="html" indent="yes" encoding="UTF-8" omit-xml-    declaration="yes" />
<xsl:key name="groups" match="//nms:group" use="nms:groupName"/>
 <xsl:template match="/">
 <xsl:for-each select="//nms:group[count(. | key('groups',nms:groupName)[1]) = 1]">
 <xsl:sort select="nms:groupOrderNumber"/>     
 <table border="1">
 <tr> <xsl:value-of select="nms:groupName"/> </tr> 
 <xsl:for-each select="key('groups',nms:groupName)">                
      <xsl:for-each select="./nms:metaData">        
         <tr>
         <td><xsl:value-of select="nms:metaDataName"/> </td>
         <td><xsl:value-of select="nms:metaDataValue"/> </td>
         </tr>
     </xsl:for-each>
    </xsl:for-each> 
 </table>      
 </xsl:for-each> 
 </xsl:template>
</xsl:stylesheet> 

基於您未指定XSLT版本的原始問題,我編寫了此代碼,這是XSLT 2.0中的解決方案:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:template match="/*">
        <xsl:for-each-group select="//group" group-by="groupOrderNumber">
            Manufacturer: <xsl:value-of select="groupName"/><xsl:text>&#xd;</xsl:text>
            <xsl:for-each select="//group[groupOrderNumber=current-grouping-key()]">
                Model:<xsl:value-of select="metaData[metaDataName='HeaderName']/metaDataValue"/> <xsl:text>&#xd;</xsl:text>
            </xsl:for-each>
        </xsl:for-each-group>
        <xsl:text>&#xd;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

它使用xsl:for-each-group指令對group分支中的groupOrderNumber值進行group

然后,我在內部xsl:for-eachselect中使用current-grouping-key來迭代與當前分組鍵匹配的組。

輸出為:

        Manufacturer: Maruthi
            Model:Maruthi 800
            Model:Maruthi Alto
        Manufacturer: Honda
            Model:Honda City
            Model:Honda Amaze

您可能想要添加自己的格式,但是由於我不知道任何特定的格式要求,因此上述XSLT至少應該為您提供所需的基礎知識。

順便說一句,我在輸出中使用<xsl:text>&#xd;</xsl:text>作為回車符。

盡管這不是您正在使用的版本,但如果有人在XSLT 2.0中尋找分組解決方案時發現此問題,我將保留此答案。

這仍然令人困惑,因為(a)您的樣式表使用前綴,但是顯示的輸入沒有名稱空間,並且(b)您的樣式表產生的輸出與所示的有所不同。

我猜你想做這樣的事情:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:key name="groups" match="group" use="groupName"/>

<xsl:template match="/product">
    <xsl:for-each select="group[count(. | key('groups', groupName)[1]) = 1]">
        <xsl:sort select="groupOrderNumber"/>     
        <table border="1" width="250px">
            <tr>
                <th>Manufacturer</th>
                <td><xsl:value-of select="groupName"/></td>
            </tr> 
            <xsl:for-each select="key('groups', groupName)">  
                <xsl:sort select="metaData[metaDataName='sequenceOrderNumber']/metaDataValue"/>   
                <tr>
                    <th>Model</th>
                    <td><xsl:value-of select="metaData[metaDataName='HeaderName']/metaDataValue"/></td>
                </tr> 
            </xsl:for-each>
        </table>      
    </xsl:for-each> 
</xsl:template>

</xsl:stylesheet> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM