[英]Grouping XML with XSL
我有點堅持分組。 我有以下XML代碼:
<?xml version="1.0" encoding="UTF-8"?>
<isif_data>
<date>29.05.
<event-date>
<type>type1</type>
<Time Timesort="1845">18.45</Time>
<title>event1</title>
<cell/>
<place>abc</place>
</event-date>
<event-date>
<type>type1</type>
<Time Timesort="0900">9</Time>
<title>event2</title>
<cell/>
<place>abd</place>
</event-date>
<event-date>
<type>type2</type>
<Time Timesort="1930">19.30</Time>
<title>event3</title>
<cell/>
<place>abe</place>
</event-date>
<event-date>
<type>type2</type>
<Time Timesort="1900">19</Time>
<title>event4</title>
<cell/>
<place>abf</place>
</event-date>
</date>
<date>30.05.
<event-date>
<type>type1</type>
<Time Timesort="1845">18.45</Time>
<title>event5</title>
<cell/>
<place>abg</place>
</event-date>
<event-date>
<type>type2</type>
<Time Timesort="0900">9</Time>
<title>event6</title>
<cell/>
<place>abh</place>
</event-date>
<event-date>
<type>type1 </type>
<Time Timesort="1500">15</Time>
<title>event7</title>
<cell/>
<place>abi</place>
</event-date>
<event-date>
<type>type2</type>
<Time Timesort="1700">17</Time>
<title>event8</title>
<cell/>
<place>abj</place>
</event-date>
</date>
</isif_data>
現在,我需要生成的XML看起來像這樣:
<?xml version="1.0" encoding="UTF-8"?>
<isif_data>
<date>29.05.</date>
<type>type1</type>
<Time>9</Time>
<title>event2</title>
<cell/>
<place>abd</place>
<Time>18.45</Time>
<title>event1</title>
<cell/>
<place>abc</place>
<type>type2</type>
<Time>19</Time>
<title>event4</title>
<cell/>
<place>abf</place>
<Time>19.30</Time>
<title>event3</title>
<cell/>
<place>abe</place>
<date>30.05.</date>
<type>type1</type>
<Time>15</Time>
<title>event7</title>
<cell/>
<place>abi</place>
<Time>18.45</Time>
<title>event5</title>
<cell/>
<place>abg</place>
<type>type2</type>
<Time>9</Time>
<title>event6</title>
<cell/>
<place>abh</place>
<Time>17</Time>
<title>event8</title>
<cell/>
<place>abj</place>
</isif_data>
我用Muenchian方法嘗試過,但從未如我所願地工作。 這里的任何人,有一個想法如何使它工作? 我需要使用xsl 1.0版。 如果您需要更多信息,請告訴我。 提前致謝 :-)
編輯:我嘗試了以下XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:key name="type" match="event-date" use="type" />
<xsl:template match="isif_data">
<xsl:element name="isif_data">
<xsl:for-each select="date">
<xsl:element name="date"><xsl:value-of select="date"/></xsl:element>
<xsl:element name="cell"/>
<xsl:for-each select="event-date[count(. | key('type', type)[1]) = 1]">
<xsl:sort select="time/@Timesort" />
<xsl:call-template name="type" />
<xsl:for-each select="key('type', type)">
<xsl:call-template name="time" />
<xsl:call-template name="title" />
<xsl:call-template name="place" />
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
如果您需要模板,我也可以提供它們。 我不確定是否需要它們。
是否可以對原始代碼中的每個日期標記進行分組?
這個:
<xsl:key name="type" match="event-date" use="type" />
將按類型將所有事件日期分組,而不考慮日期。 由於要在每個日期內按類型對事件進行分組,因此需要同時使用日期和鍵中的類型:
<xsl:key name="type" match="event-date" use="concat (../., '|', type)" />
如果我假設帶或不帶空格的類型應該分組為一個,則確實需要進行鍵控,因為需要對空格進行歸一化。 然后它將看起來像:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="types" match="event-date"
use="concat(normalize-space(../text()), normalize-space(type))"/>
<xsl:template match="event-date">
<xsl:variable name="thisType" select="normalize-space(type)"/>
<xsl:variable name="thisSet"
select="key('types', concat(normalize-space(../text()), $thisType))"/>
<xsl:if test="count(. | $thisSet[1]) = 1">
<type><xsl:value-of select="$thisType"/>
<xsl:for-each select="$thisSet">
<xsl:apply-templates select="node()"/>
</xsl:for-each>
</type>
</xsl:if>
</xsl:template>
<xsl:template match="type"/>
<xsl:template match="node()">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:apply-templates select="node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
沒有空格等,您不需要整個鍵控內容。 然后看起來像:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template
match="event-date[not(type = preceding-sibling::*/type)]">
<type><xsl:value-of select="type"/>
<xsl:apply-templates select="../*[type=current()/type]/node()"/>
</type>
</xsl:template>
<xsl:template match="event-date | type"/>
<xsl:template match="node()">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:apply-templates select="node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.