XSLT 1.0适用于每个组平面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> <

我需要一些帮助。我对XSLT有点陌生

我知道在2.0中,每个小组都可以使用它来解决我的问题,但我仅限于1.0

我需要使用类似于“groupstartingwith”函数的东西对平面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>

基础知识
皇帝讽刺剧
鲍勃·迪伦
美国
哥伦比亚
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())
)选择组中的所有项目。不清楚您为什么认为需要“循环”或在何处/如何需要该特定值。请提出一个新问题来解释这一点。