按脚本重新排序xml元素

时间:2014-10-07 09:19:05

标签: python xml xslt lxml

我有很多描述某些文档的XML文件。不幸的是,其中一些包含有关页面排序的错误。在确定了正确的顺序(可能是手工)后,我想使用脚本重新排序页面。 Python lxml是首选的脚本类型,但欢迎在标准Linux环境中工作的其他解决方案。

输入文件如下:

<text>
  <page>content of page 2</page>
  <page>content of page 3</page>
  <page>content of page 1</page>
</text>

输出文件如下:

<text>
  <page>content of page 1</page>
  <page>content of page 2</page>
  <page>content of page 3</page>
</text>

注意:由于所有元素都具有相同的名称且不具有属性,因此不必重新排序元素的// text()重新排序元素。

1 个答案:

答案 0 :(得分:1)

  

第一个元素到达位置2,第二个元素到达位置3,和   第三位是位置1。

在XSLT中实现起来有点困难(特别是在XSLT 1.0中),但假设您正在使用libxslt处理器,您可以利用EXSLT str:tokenize扩展函数来简化问题:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:str="http://exslt.org/strings"
extension-element-prefixes="str">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:param name="order">2,3,1</xsl:param>

<xsl:template match="/">
    <text>
        <xsl:for-each select="text/page">
            <xsl:sort select="str:tokenize($order, ',')[count(current()/preceding-sibling::page) + 1]" data-type="number" order="ascending"/>
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </text>
</xsl:template>

</xsl:stylesheet>

如您所见,您可以在样式表中对订单进行硬编码,也可以在运行时将其作为参数传递。