在XSLT 1.0中移动一些项后重命名列表元素。

时间:2013-03-13 17:51:34

标签: sorting xslt dynamic

我有这个xml:

 <Process>
          <elem0>
             <pcode>xx<pcode>
          </elem0>
          <elem1>
             <pcode>xy<pcode>
          </elem1>
          <elem2>
             <pcode>ab<pcode>
          </elem2>
          <elem3>
             <pcode>AD<pcode>
          </elem3>               
    </Process>

我必须将带有pcode value ='xy'的元素移动到EdProcess,我正在使用xslt成功完成它。此外,我在这里的成员的帮助下,按顺序显示了Process元素。现在的问题是,EdProcess需要从elem0开始,任何在其中移动的新元素都应该按顺序排列,即elem0,elem1,elem2等。

<Process>
      <elem0>
         <pcode>xx<pcode>
      </elem0>
      <elem1>
         <pcode>ab<pcode>
      </elem1>
      <elem2>
         <pcode>AD<pcode>
      </elem2>               
</Process>



<EdProcess>
          <elem1>
             <pcode>xy<pcode>
          </elem1>
   </EdProcess>

我希望它是

<Process>
          <elem0>
             <pcode>xx<pcode>
          </elem0>
          <elem1>
             <pcode>ab<pcode>
          </elem1>
          <elem2>
             <pcode>AD<pcode>
          </elem2>               
    </Process>

 <EdProcess>
          <elem0>
             <pcode>xy<pcode>
          </elem0>
   </EdProcess>

所以它在前端正确显示,但我卡住了。尝试排序但没有工作。 elem标识正在发生变化,因此我很难使用某种模板。由于我正在创建EdProcess,因此模板匹配无效。谢谢你的建议!

1 个答案:

答案 0 :(得分:0)

这可以通过对我之前问题的答案进行一些小修改来完成:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/*">
    <root>
      <Process>
        <xsl:apply-templates select="*[pcode != 'xy']" mode="elems" />
      </Process>
      <EdProcess>
        <xsl:apply-templates select="*[pcode = 'xy']" mode="elems" />
      </EdProcess>
    </root>
  </xsl:template>

  <xsl:template match="*" mode="elems">
    <xsl:element name="elem{position() - 1}">
      <xsl:apply-templates select="@* | node()" />
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

当在以下输入上运行时:

<Process>
  <elem0>
    <pcode>xx</pcode>
  </elem0>
  <elem1>
    <pcode>xy</pcode>
  </elem1>
  <elem2>
    <pcode>ab</pcode>
  </elem2>
  <elem3>
    <pcode>xy</pcode>
  </elem3>
  <elem4>
    <pcode>AD</pcode>
  </elem4>
</Process>

结果是:

<root>
  <Process>
    <elem0>
      <pcode>xx</pcode>
    </elem0>
    <elem1>
      <pcode>ab</pcode>
    </elem1>
    <elem2>
      <pcode>AD</pcode>
    </elem2>
  </Process>
  <EdProcess>
    <elem0>
      <pcode>xy</pcode>
    </elem0>
    <elem1>
      <pcode>xy</pcode>
    </elem1>
  </EdProcess>
</root>