我需要一些帮助。我是XSLT的新手。
我知道在2.0中您可以使用For-Each-Group来解决我的问题,但我仅限于1.0。
我需要使用“ group-starting-with”功能对平面XML进行分组。
这只是一个例子,但我的真正问题非常相似。
我有这个XML:
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<xpto name="1">ABC</xpto>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
<xpto name="2">ABC</xpto>
<xpto name="1">ABC</xpto>
<title>Hide your heart</title>
<artist>Bob Dylan</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<year>1988</year>
<xpto name="2">ABC</xpto>
</catalog>
我希望它是
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<group>
<xpto name="1">ABC</xpto>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
<xpto name="2">ABC</xpto>
</group>
<group>
<xpto name="1">ABC</xpto>
<title>Hide your heart</title>
<artist>Bob Dylan</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<year>1988</year>
<xpto name="2">ABC</xpto>
</group>
</catalog>
因此,我想在每次出现以下内容时对元素进行分组:
<xpto name="1">ABC</xpto>
使用XSLT 1.0有什么方法吗?
非常感谢您!
答案 0 :(得分:1)
假设要对以<xpto name="1">
元素开头的元素进行分组,则可以定义一个键,以按其他子元素之前的第一个此类元素对它们进行分组:
<xsl:key name="start" match="*[not(self::xpto[@name='1'])]" use="generate-id(preceding-sibling::xpto[@name='1'][1])" />
然后,您可以选择所有开始元素,并像这样获得其他组项目:
<xsl:apply-templates select=".|key('start', generate-id())" />
尝试使用此XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="start" match="*[not(self::xpto[@name='1'])]" use="generate-id(preceding-sibling::xpto[@name='1'][1])" />
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="catalog">
<xsl:copy>
<xsl:for-each select="xpto[@name='1']">
<group>
<xsl:apply-templates select=".|key('start', generate-id())" />
</group>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>