[英]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>
</xsl:text>
<xsl:for-each select="//group[groupOrderNumber=current-grouping-key()]">
Model:<xsl:value-of select="metaData[metaDataName='HeaderName']/metaDataValue"/> <xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:for-each-group>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
它使用xsl:for-each-group指令對group
分支中的groupOrderNumber
值進行group
。
然后,我在內部xsl:for-each
的select
中使用current-grouping-key
來迭代與當前分組鍵匹配的組。
輸出為:
Manufacturer: Maruthi
Model:Maruthi 800
Model:Maruthi Alto
Manufacturer: Honda
Model:Honda City
Model:Honda Amaze
您可能想要添加自己的格式,但是由於我不知道任何特定的格式要求,因此上述XSLT至少應該為您提供所需的基礎知識。
順便說一句,我在輸出中使用<xsl:text>
</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.