在 xsl 1.0 中移动行数据 [英] Shifting row data in xsl 1.0

查看:31
本文介绍了在 xsl 1.0 中移动行数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的 XML 中有多个 Rows 数据,就像这样 -

I have multiple Rows data in my XML like this -

<ROW TYPE="SPECIFICATION" ID="1">
    <R1>English1</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="1">
    <R1>Maths1</R1>
</ROW>
<ROW TYPE="TOTAL" ID="1">
    <R1>Code1</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="2">
    <R1>English2</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="2">
    <R1>Maths2</R1>
</ROW>
<ROW TYPE="TOTAL" ID="2">
    <R1>Code2</R1>
</ROW>

我希望我的输出显示在图像中,就像这个 ROW 数据在 for-each 循环中工作一样.并且要求是应该首先显示 ROW TYPE="TOTAL" ID="1" 然后它的 ROW TYPE="SPECIFICATION" 数据.再次循环进一步,应首先显示 ROW TYPE="TOTAL" ID="2",然后显示其 ROW TYPE="SPECIFICATION" 数据.

I want my Output to be displayed in Image like that this ROW data works in a for-each loop. And the requirement is that ROW TYPE="TOTAL" ID="1" should be displayed first then its ROW TYPE="SPECIFICATION" data. Moving further in loop again, ROW TYPE="TOTAL" ID="2" should be displayed first then its ROW TYPE="SPECIFICATION" data.

基本上应该是这样的 -

Basically it should come like this -

Code1
  English1
  Maths1
Code2
  English2
  Maths2

XSLT 代码适用于序列,就像 for-2each 循环一样.但是我需要先为该 ID 移动 TOTAL 行.请为此提出逻辑建议.

The XSLT code works for sequence as for-2each loop works. But I need to shift the TOTAL row first for that ID. Please suggest logic for this.

推荐答案

这种转变:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>
 <xsl:key name="kRowById"
      match="ROW[not(@TYPE='TOTAL')]" use="@ID"/>

 <xsl:template match="ROW[@TYPE='TOTAL']">
  <xsl:copy-of select="."/>
  <xsl:copy-of select="key('kRowById', @ID)"/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

当应用于提供的 XML 时(包装成单个顶部元素以形成格式良好的 XML 文档):

when applied on the provided XML (wrapped into a single top element to be made a well-formed XML document):

<t>
    <ROW TYPE="SPECIFICATION" ID="1">
        <R1>English1</R1>
    </ROW>
    <ROW TYPE="SPECIFICATION" ID="1">
        <R1>Maths1</R1>
    </ROW>
    <ROW TYPE="TOTAL" ID="1">
        <R1>Code1</R1>
    </ROW>
    <ROW TYPE="SPECIFICATION" ID="2">
        <R1>English2</R1>
    </ROW>
    <ROW TYPE="SPECIFICATION" ID="2">
        <R1>Maths2</R1>
    </ROW>
    <ROW TYPE="TOTAL" ID="2">
        <R1>Code2</R1>
    </ROW>
</t>

产生想要的结果(其中想要的元素被重新排序:

produces the wanted result (in which the wanted elements are re-ordered:

<ROW TYPE="TOTAL" ID="1">
   <R1>Code1</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="1">
   <R1>English1</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="1">
   <R1>Maths1</R1>
</ROW>
<ROW TYPE="TOTAL" ID="2">
   <R1>Code2</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="2">
   <R1>English2</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="2">
   <R1>Maths2</R1>
</ROW>

这篇关于在 xsl 1.0 中移动行数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆