XSLT 1.0适用于每个组平面XML
我需要一些帮助。我对XSLT有点陌生 我知道在2.0中,每个小组都可以使用它来解决我的问题,但我仅限于1.0 我需要使用类似于“groupstartingwith”函数的东西对平面XML进行分组 这只是一个例子,但我真正的问题非常相似 我有以下XML:XSLT 1.0适用于每个组平面XML,xml,xslt,xslt-1.0,xslt-grouping,Xml,Xslt,Xslt 1.0,Xslt Grouping,我需要一些帮助。我对XSLT有点陌生 我知道在2.0中,每个小组都可以使用它来解决我的问题,但我仅限于1.0 我需要使用类似于“groupstartingwith”函数的东西对平面XML进行分组 这只是一个例子,但我真正的问题非常相似 我有以下XML: <?xml version="1.0" encoding="UTF-8"?> <catalog> <xpto name="1">ABC</xpto> <
<?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>
基础知识
皇帝讽刺剧
鲍勃·迪伦
美国
哥伦比亚
10.90
1985
基础知识
基础知识
隐藏你的心
鲍勃·迪伦
英国
哥伦比亚唱片公司
9.90
1988
基础知识
我希望它是:
<?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>
基础知识
皇帝讽刺剧
鲍勃·迪伦
美国
哥伦比亚
10.90
1985
基础知识
基础知识
隐藏你的心
鲍勃·迪伦
英国
哥伦比亚唱片公司
9.90
1988
基础知识
因此,每次出现以下情况时,我都要对元素进行分组:
<xpto name="1">ABC</xpto>
ABC
有没有办法用XSLT1.0做到这一点
多谢各位 假设您希望以
元素开始对元素进行分组,您可以定义一个键,以按位于其他子元素之前的第一个此类元素对其进行分组:
<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>
Hi,欢迎来到StackOverflow!你能提供到目前为止你已经尝试过的吗?亲爱的Tim C,非常感谢。它解决了我的问题!!我无法投票,因为我的个人资料是新的,stackoverflow不允许:(@kaiser:你可以通过接受答案来结束问题玩了一会儿后我需要你再次帮助。添加组标记后,我需要循环每个组并获得艺术家的价值。我如何才能做到这一点?我正在与模板逻辑作斗争…@kaiser,提出一个新问题,并提供必要的细节。在你原来的问题中假设您想输出组中的所有元素,Tim已向您演示了如何执行此操作(以及如何使用|键('start',generate-id())
)选择组中的所有项目。不清楚您为什么认为需要“循环”或在何处/如何需要该特定值。请提出一个新问题来解释这一点。