我有很多描述某些文档的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()重新排序元素。
答案 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>
如您所见,您可以在样式表中对订单进行硬编码,也可以在运行时将其作为参数传递。