2013-03-22 50 views
-1

行数据我有多个行元素的数据在我这样的XML -在XSL 1.0

<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 TYPE="MAIN" ID="3"> 
    <R1>Code3</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="4"> 
    <R1>English4</R1> 
</ROW> 
<ROW TYPE="TOTAL" ID="4"> 
    <R1>Code4</R1> 
</ROW> 

我要显示在图像输出我喜欢这行数据在for-each循环工作。并且要求首先显示ROW TYPE =“TOTAL”ID =“1”,然后显示其ROW TYPE =“SPECIFICATION”数据。再次进入循环,应先显示ROW TYPE =“TOTAL”ID =“2”,然后显示其ROW TYPE =“SPECIFICATION”数据。如果ROW_TYPE不同(可以是任何东西),那么它应该按顺序出现。它仅限于SPECIFICATION和TOTAL。

基本上,它也应该是这样 -

Code1 
    English1 
    Maths1 
Code2 
    English2 
    Maths2 
Code3 
Code4 
    English4 

的XSLT代码适用于序列for-each循环的作品。但是我需要先为该ID移动TOTAL行。请为此提出逻辑。

+0

这不是一个http://stackoverflow.com/questions/15539332/shifting-row-data-in-xsl-1-0重复? – 2013-03-22 04:27:28

+0

如果你看到,这个XML有一个小的改变。此前的逻辑是针对2种ROW数据的。现在数据是变化的。 – Kundan 2013-03-22 04:28:42

+0

所以如果你有''ROW TYPE =“SPECIFICATION”/>''(为了简洁起见我省略了R1)在结果? – JLRishe 2013-03-22 04:54:18

回答

0

该转化

<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' or @TYPE='MAIN')]" 
     use="@ID"/> 

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

当在XML文档施加(从所提供的XML片段产生,由包成一个单一的顶部元件):

<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> 
    <ROW TYPE="MAIN" ID="3"> 
     <R1>Code3</R1> 
    </ROW> 
    <ROW TYPE="SPECIFICATION" ID="4"> 
     <R1>English4</R1> 
    </ROW> 
    <ROW TYPE="TOTAL" ID="4"> 
     <R1>Code4</R1> 
    </ROW> 
</t> 

产生想要的,正确的结果:

<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> 
<ROW TYPE="MAIN" ID="3"> 
    <R1>Code3</R1> 
</ROW> 
<ROW TYPE="TOTAL" ID="4"> 
    <R1>Code4</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="4"> 
    <R1>English4</R1> 
</ROW> 

更新

按照由在注释中OP请求时,如果从“规范”不同的任意值必须被放置在该组的头上,使用以下代码:

<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' or @TYPE='MAIN')]" 
     use="@ID"/> 

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

有关ROW_TYPE是否包含值的任何建议,该值可以是任何未知的数据或输入文件中包含的数据。 – Kundan 2013-03-22 05:10:42

+0

@Kundan,如果没有指定在这种情况下必须完成的工作,则不能有任何建议...... – 2013-03-22 05:13:18

+0

是否意味着如果我们不知道ROW_TYPE中客户端发来的数据是什么,那么我们无法显示数据就像我们现在正在做的那样。应该始终知道ROW_TYPE? – Kundan 2013-03-22 05:16:18