我有这个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,因此模板匹配无效。谢谢你的建议!
答案 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>