Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在xsl 1.0中移动行数据_Xml_Xslt_Xslt 1.0 - Fatal编程技术网

Xml 在xsl 1.0中移动行数据

Xml 在xsl 1.0中移动行数据,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我的XML中有多行数据,如下所示- <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&g

我的XML中有多行数据,如下所示-

<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>

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

此转换:

<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文档):


英语1
数学1
代码1
英语2
数学2
代码2
生成所需结果(其中所需元素被重新排序:

<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>

代码1
英语1
数学1
代码2
英语2
数学2

谢谢,您的逻辑确实以所需的方式工作。还有一件事是,如果我有不同于所描述的元素,那么当我将此逻辑应用于完整的xml时,它首先显示行数据的空元素,然后用值重复相同的行数据元素。@Kundan,请问一个新的SO问题并提供一个表示我很乐意帮助您。谢谢,但是这个问题已经解决了。我只想在这里讨论这个XML部分。我提供了两行类型的XML(规格和总数)。我可以保存更多的行类型,它可以保存任何值。因此,此代码将跳过其他行类型。请提出建议。@Kundan,请提出一个新问题并解释清楚--我不理解您的评论。我添加了一个新问题,请检查。
<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>
<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>