使用xsltproc随机化XML
我有一个简单的xml文件:使用xsltproc随机化XML,xml,xslt,Xml,Xslt,我有一个简单的xml文件: <headlines> <headline> ... </headline> <headline> ... </headline> <headline> ... </headline> </headlines> ... ... ... 我想做的就是改变标题出现的顺序。我一直在愚弄这个模板应该是什么样子,但我无法让它工作 <xs
<headlines>
<headline>
...
</headline>
<headline>
...
</headline>
<headline>
...
</headline>
</headlines>
...
...
...
我想做的就是改变标题出现的顺序。我一直在愚弄这个模板应该是什么样子,但我无法让它工作
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/headline">
<xsl:for-each select="headline">
__not sure what to do here? rand() isn't a thing?__
__不知道该怎么办?兰德()不是什么东西吗__
一种方法是使用函数generate-id()作为排序标准。假设您有以下输入:
<?xml version="1.0" encoding="ISO-8859-1"?>
<headlines>
<headline>
Limburg
</headline>
<headline>
Fukushima
</headline>
<headline>
Große Koalition
</headline>
<headline>
Flugzeugabsturz
</headline>
</headlines>
林堡
福岛
格罗伊科阿利翁酒店
弗卢泽加布斯图兹
使用此XSLT,您可以“随机化”输出:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="ISO-8859-1"/>
<xsl:template match="/headlines">
<headlines>
<xsl:for-each select="headline">
<xsl:sort select="generate-id(.)"/>
<headline id="{generate-id(.)}">
<xsl:copy-of select="./text()"/>
</headline>
</xsl:for-each>
</headlines>
</xsl:template>
</xsl:stylesheet>
结果是
<?xml version="1.0" encoding="ISO-8859-1"?>
<headlines><headline id="idm3928">
Limburg
</headline><headline id="idm5512">
Flugzeugabsturz
</headline><headline id="idm5704">
Große Koalition
</headline><headline id="idm5920">
Fukushima
</headline></headlines>
林堡
弗卢泽加布斯图兹
格罗伊科阿利翁酒店
福岛
应该注意三件事:
- 标题标记中属性“id”的输出不是必需的。这只是为了可视化排序标准
- 排序顺序取决于所使用的xslt处理器(在本例中为Debian xsltproc)
- 这不是真正的“随机”。然而,处理器xsltproc实际上会在每次调用时选择新的ID,因此实际上标题会被“洗牌”李>
<?xml version="1.0" encoding="ISO-8859-1"?>
<headlines>
<headline>
Limburg
</headline>
<headline>
Fukushima
</headline>
<headline>
Große Koalition
</headline>
<headline>
Flugzeugabsturz
</headline>
</headlines>
林堡
福岛
格罗伊科阿利翁酒店
弗卢泽加布斯图兹
使用此XSLT,您可以“随机化”输出:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="ISO-8859-1"/>
<xsl:template match="/headlines">
<headlines>
<xsl:for-each select="headline">
<xsl:sort select="generate-id(.)"/>
<headline id="{generate-id(.)}">
<xsl:copy-of select="./text()"/>
</headline>
</xsl:for-each>
</headlines>
</xsl:template>
</xsl:stylesheet>
结果是
<?xml version="1.0" encoding="ISO-8859-1"?>
<headlines><headline id="idm3928">
Limburg
</headline><headline id="idm5512">
Flugzeugabsturz
</headline><headline id="idm5704">
Große Koalition
</headline><headline id="idm5920">
Fukushima
</headline></headlines>
林堡
弗卢泽加布斯图兹
格罗伊科阿利翁酒店
福岛
应该注意三件事:
- 标题标记中属性“id”的输出不是必需的。这只是为了可视化排序标准
- 排序顺序取决于所使用的xslt处理器(在本例中为Debian xsltproc)
- 这不是真正的“随机”。然而,处理器xsltproc实际上会在每次调用时选择新的ID,因此实际上标题会被“洗牌”李>
math:random
将是更好的选择。不幸的是,只有最新版本的xsltproc
支持此任务所必需的--seed rand
选项。math:random
函数肯定是一种替代方法。然而,我的解决方案将不得不改变,因为在排序中使用随机数作为键可能会产生不可预测的结果(当然,除了随机输出之外,这也是需要的)。一种方法是创建
标记的临时表示(例如,通过从模板返回),并使用随机数增强它们。调用模板将根据关键字对返回的结果进行排序。我确信libxslt
只对排序关键字的表达式求值一次,其他XSLT处理器可能也会这样做。因此,您的解决方案可以在不改变结构的情况下使用。谢谢-这是一个很好的开始。我现在正在吐,但中间什么也没有,我怀疑是因为里面有其他标记,而我们只选择文本?请用“/*”
替换“/text()”
。应该可以。EXSLT函数math:random
将是一个更好的选择。不幸的是,只有最新版本的xsltproc
支持此任务所必需的--seed rand
选项。math:random
函数肯定是一种替代方法。然而,我的解决方案将不得不改变,因为在排序中使用随机数作为键可能会产生不可预测的结果(当然,除了随机输出之外,这也是需要的)。一种方法是创建
标记的临时表示(例如,通过从模板返回),并使用随机数增强它们。调用模板将根据关键字对返回的结果进行排序。我确信libxslt
只对排序关键字的表达式求值一次,其他XSLT处理器可能也会这样做。因此,您的解决方案可以在不改变结构的情况下使用。谢谢-这是一个很好的开始。我现在正在吐,但中间什么也没有,我怀疑是因为里面有其他标记,而我们只选择文本?请用“/*”
替换“/text()”
。应该这样做。