【发布时间】:2015-01-14 19:55:36
【问题描述】:
我是 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 sn-p
<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?
【问题讨论】:
-
如果您能解释一下转换背后的逻辑,将会有所帮助。我在结果中看不到任何分组:您从 4 个段开始并以相同的 4 个段结束,没有添加任何数据(AFAICS)。 -- 另请注意,您的两个输入都不是格式正确的:没有根元素,并且前缀未绑定到命名空间。
标签: xml xpath xslt-1.0 grouping hierarchical-data