我是xslt的新手,因此无法理解这里提供的复杂解决方案。 以非Muenchian方式对沉重的数据结构进行分组(这意味着存在大量的属性和元素,因此无法与任何串联的解决方案一起使用)。 我觉得串联大数据会影响性能。 这是我尝试的示例输入数据,必需的输出和xsl:

#输入xml#

    <out:OuterSegment>
        <out:Segment >
             <out:from Code="CHN"/>
             <out:tothis Code="HYD"/>
             <out:group>0</out:group>
        </out:Segment>
        <out:Segment >
             <out:from Code="HYD"/>
             <out:tothis Code="BLR"/>
             <out:group>1</out:group>
        </out:Segment>
        <out:Segment >
             <out:from Code="BLR"/>
             <out:tothis Code="TVN"/>
             <out:group>2</out:group>
        </out:Segment>
        <out:Segment >
             <out:from Code="TVN"/>
             <out:tothis Code="DEL"/>
             <out:group>2</out:group>
        </out:Segment>
    </out:OuterSegment>

输出xml

    <out2:OuterSegment>
        <out2:Segment >
             <out2:from Code="CHN"/>
             <out2:tothis Code="HYD"/>
             <out2:group>0</out2:group>
        </out2:Segment>
    </out2:OuterSegment>    
    <out2:OuterSegment>
        <out2:Segment >
             <out2:from Code="HYD"/>
             <out2:tothis Code="BLR"/>
             <out2:group>1</out2:group>
        </out2:Segment>
    </out2:OuterSegment>
    <out2:OuterSegment>
        <out2:Segment >
             <out2:from Code="BLR"/>
             <out2:tothis Code="TVN"/>
             <out2:group>2</out2:group>
        </out2:Segment>
    </out2:OuterSegment>
    <out2:OuterSegment>
        <out2:Segment >
             <out2:from Code="TVN"/>
             <out2:tothis Code="DEL"/>
             <out2:group>2</out2:group>
        </out2:Segment>
    </out2:OuterSegment>

XSL代码段

    <xsl:choose>
    <xsl:when test="position() = 1">
         <xsl:message> its the first row </xsl:message>
         <out:OuterSegment>            
                <xsl:apply-templates select="in2:IncomingSegment"
                                                    mode="localIncomingSegmentRefToSegment" />
            </out:OuterSegment>
    </xsl:when>
    <xsl:otherwise>
         <xsl:variable name="prevgroup" select="//in2:IncomingSegment[position() - 1]/@Group"/>
         <xsl:message> is the subsequent row</xsl:message>
         <xsl:if test="$prevgroup = //in2:IncomingSegment[$prevgroup]/@Group">
                <xsl:apply-templates select="in2:IncomingSegment"
                                                    mode="localIncomingSegmentRefToSegment" />                      
         </xsl:if>
         <xsl:if test="$prevgroup != //in2:IncomingSegment[$prevgroup]/@Group">
                <out:OuterSegment>     
                        <xsl:apply-templates select="in2:IncomingSegment"
                                                    mode="SegmentRefToSegment" />
                </out:OuterSegment>
         </xsl:if>
    </xsl:otherwise>
    </xsl:choose>

我需要提到的是,上面的输入xml是由另一个xslt生成的,其输入为:

实际输入xml

    <in:RefSegment key="1" group="0">
        <in:inSegment >
             <in:from Code="CHN"/>
             <in:tothis Code="HYD"/>
        </in:inSegment>
    </in:RefSegment>
    <in:RefSegment key="2" group="1">
        <in:inSegment >
             <in:from Code="HYD"/>
             <in:tothis Code="BLR"/>
        </in:inSegment>
    </in:RefSegment>
    <in:RefSegment key="3" group="2">
        <in:inSegment >
             <in:from Code="BLR"/>
             <in:tothis Code="TVN"/>
        </in:inSegment>
    </in:RefSegment>
    <in:RefSegment key="4" group="2">
        <in:inSegment >
             <in:from Code="TVN"/>
             <in:tothis Code="BLR"/>
        </in:inSegment>
    </in:RefSegment>
    <in:DataSegments>
        <in:Data >
                    <in:keyref> 0 </in:keyref>
        </in:Data>
        <in:Data >
            <in:keyref> 1 </in:keyref>
        </in:Data>
        <in:Data >
                <in:keyref> 2 </in:keyref>
        </in:Data>
            <in:Data >
                <in:keyref> 2 </in:keyref>
        </in:Data>
  <in:DataSegments>

是否可以从上述实际的input.xml中一次性获得最终的output.xml?

#1楼 票数:0

我不知道您如何处理有关inout2前缀的输入和输出xml的名称空间,以及名称空间是否值得关注,所以也许这种方法没有用,但我想分享一下这个想法。
这是基于以下假设<in:RefSegment>您的实际输入XML建议,所有<in:Data>节点都位于与<in:RefSegment>对应的位置-如果不是这种情况,请将其添加到您的问题中,这样必须对<in:RefSegment>group属性的值和相应的<in:keyref>值进行<in:keyref>

作为对输入XML代码段的调整,我将<in:RefSegment>节点包装在具有示例名称空间: <root xmlns:in="http://www.example.com">并添加了示例名称​​空间xmlns:in="http://www.example.com"xmlns:out2="http://www.example2.com"到样式表声明。 由于存在xmlns:out2命名空间,因此将该命名空间添加到每个out2:OuterSegment节点。

跟随XSLT

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:in="http://www.example.com" xmlns:out2="http://www.example2.com"
  exclude-result-prefixes="in" version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
  <xsl:strip-space elements="*"/>
    <xsl:template match="in:RefSegment">
    <xsl:variable name="position" select="position()"/>
     <out2:OuterSegment>
       <out2:Segment>
         <out2:from>
           <xsl:attribute name="Code">
             <xsl:value-of select="in:inSegment/in:from/@Code" />
           </xsl:attribute>
         </out2:from>
         <out2:tothis Code="HYD">
            <xsl:attribute name="Code">
              <xsl:value-of select="in:inSegment/in:tothis/@Code" />
            </xsl:attribute>
         </out2:tothis>
         <out2:group>
           <xsl:value-of select="normalize-space(//in:DataSegments/in:Data[$position]/in:keyref)"/>
        </out2:group>
      </out2:Segment>
    </out2:OuterSegment>
  </xsl:template>
  <xsl:template match="in:DataSegments"/>
</xsl:transform>

通过调整缺少的结束</in:DataSegments>应用于实际的输入XML时,将产生以下结果:

<out2:OuterSegment xmlns:out="http://www.example2.com">
  <out2:Segment>
    <out2:from Code="CHN"/>
    <out2:tothis Code="HYD"/>
    <out2:group>0</out2:group>
  </out2:Segment>
</out2:OuterSegment>
<out2:OuterSegment xmlns:out="http://www.example2.com">
  <out2:Segment>
    <out2:from Code="HYD"/>
    <out2:tothis Code="BLR"/>
    <out2:group>1</out2:group>
  </out2:Segment>
</out2:OuterSegment>
<out2:OuterSegment xmlns:out="http://www.example2.com">
  <out2:Segment>
    <out2:from Code="BLR"/>
    <out2:tothis Code="TVN"/>
    <out2:group>2</out2:group>
  </out2:Segment>
</out:OuterSegment>
<out:OuterSegment xmlns:out="http://www.example2.com">
   <out2:Segment>
     <out2:from Code="TVN"/>
     <out2:tothis Code="BLR"/>
     <out2:group>2</out2:group>
   </out2:Segment>
</out2:OuterSegment>

in:RefSegment匹配的模板in:RefSegment节点<xsl:template match="in:RefSegment">生成<out2:OuterSegment>节点。 <xsl:variable name="position" select="position()"/>是当前位置:RefSegment。
生成的out2:fromout2:tothis节点的属性是从in:RefSegment当前处理的检索到的:

<out2:from>
   <xsl:attribute name="Code">
        <xsl:value-of select="in:inSegment/in:from/@Code" />
    </xsl:attribute>
</out2:from>

以及从in:Data节点中位于相同位置的out2:group的值:

<out2:group>
  <xsl:value-of select="normalize-space(//in:DataSegments
                        /in:Data[$position/in:keyref)"/>
</out2:group>

带有附加的normalize-space()来删除输入中的空间。
in:DataSegments <xsl:template match="in:DataSegments"/>为空,因此in:DataSegments节点从输出中删除。

  ask by solveWithJava translate from so

未解决问题?本站智能推荐:

1回复

将相似的元素分组到不同的组中

我有以下 XML: 我想根据它们的prop将节点分组为段: 但正如您所看到的,最后一个“a”节点必须放在另一个segment ——这是因为三个“a”节点不连续。 当我尝试将它们分组时,所有“a”节点都被扔在一起。 有没有办法按照示例中的说明对它们进行分组?
2回复

XSLT1.0对XML进行排序和分组

我需要一个XSLT 1.0,它可以转换以下XML。 我期望的输出是: 条件是: Recordset1应包含Surname1节点 Recordset2应包含Surname2节点 输出应按姓氏排序 每个记录集最多有2条记录。
2回复

Muenchian组XSLT1.0中的元素选择

考虑一下带有标题,类别和联赛的足球比赛XML文档。 我试图按类别对这些游戏进行分组,但我只想保留<league>元素为“ Premier League”的记录。 该类别还应该具有一个count属性,该属性列出了相应记录的数量。 跟随XSL文件可以使用,但缺点是它还会列出未找
3回复

根据某些条件,使用XSLT1.0按顺序将XML元素分组到存储桶中

说我有一些我想要转换为HTML的XML。 XML分为有序部分: 我有几个这样的XML文档。 我需要根据标准对这些部分进行分组和转换。 将有两种不同的桶。 所以第一部分将进入一个桶(例如<div class="FormatOne"></div> ) 如
2回复

如何使用XSLT1.0进行分组汇总

我想对每个有城市人口的国家进行人口求和。 给定下面的示例代码,它不起作用。 你能帮我使它工作吗 输入为 并期望输出是 我正在工作的XSL
1回复

XSLT1.0多级分组键

我正在尝试从AWS分配文件生成报告。 我已经将适当的数据从CSV转换为XML,但还不太清楚如何在XSLT 1.0(.net)中进行键/分组 这是XML文件。 我想做的是在业务部门一级的第一,我希望每个ProductName的UsageQuantity和TotalCost之和。 然后
1回复

如何在XSLT中对元素进行分组

面对通过分组元素XSLT解决问题的困难。 我必须使用xsl:键吗? 如果是这样,该如何做或更多xsl:for-each? 这是我的问题。 我的XML文件: 以及这样的项目20,每个都有一个名称(可以重复出现,并且可以重复自己的国家/地区),如何得出按国家/地区分组的此类元素? 例如
2回复

分组明确定义的扁平XML以进行Access导入(XSLT1.0)

我有一个本地会计系统的输出,该输出由信封标记和重复的字段序列组成,但未分组。 我没有使用XSL的经验,但是一直在尝试为此找到解决方案,并且找到了适用于XSLT 2.0的解决方案。 不幸的是,Access 2007似乎仅接受XSLT 1.0转换。 您能帮我找到一个可行的XSLT 1.0解决