使用xsltproc随机化XML

使用xsltproc随机化XML,xml,xslt,Xml,Xslt,我有一个简单的xml文件: <headlines> <headline> ... </headline> <headline> ... </headline> <headline> ... </headline> </headlines> ... ... ... 我想做的就是改变标题出现的顺序。我一直在愚弄这个模板应该是什么样子,但我无法让它工作 <xs

我有一个简单的xml文件:

<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,因此实际上标题会被“洗牌”
一种方法是使用函数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,因此实际上标题会被“洗牌”
您的xslt处理器是什么?java、c#、exslt、php?试图从bash脚本中实现—我想我可以调用xsltproc。不是这样吗?可接受的答案取决于处理器是libxslt。但是如果您的处理器是libxslt,那么您可以访问EXSLT math:random()函数,因此不必依赖generate-id()的随机性。有关独立于处理器的方法,请参见:什么是xslt处理器?java、c#、exslt、php?试图从bash脚本中实现—我想我可以调用xsltproc。不是这样吗?可接受的答案取决于处理器是libxslt。但是如果您的处理器是libxslt,那么您可以访问EXSLT math:random()函数,因此不必依赖generate-id()的随机性。有关独立于处理器的方法,请参阅:EXSLT函数
math:random
将是更好的选择。不幸的是,只有最新版本的
xsltproc
支持此任务所必需的
--seed rand
选项。
math:random
函数肯定是一种替代方法。然而,我的解决方案将不得不改变,因为在排序中使用随机数作为键可能会产生不可预测的结果(当然,除了随机输出之外,这也是需要的)。一种方法是创建
标记的临时表示(例如,通过从模板返回),并使用随机数增强它们。调用模板将根据关键字对返回的结果进行排序。我确信
libxslt
只对排序关键字的表达式求值一次,其他XSLT处理器可能也会这样做。因此,您的解决方案可以在不改变结构的情况下使用。谢谢-这是一个很好的开始。我现在正在吐,但中间什么也没有,我怀疑是因为里面有其他标记,而我们只选择文本?请用
“/*”
替换
“/text()”
。应该可以。EXSLT函数
math:random
将是一个更好的选择。不幸的是,只有最新版本的
xsltproc
支持此任务所必需的
--seed rand
选项。
math:random
函数肯定是一种替代方法。然而,我的解决方案将不得不改变,因为在排序中使用随机数作为键可能会产生不可预测的结果(当然,除了随机输出之外,这也是需要的)。一种方法是创建
标记的临时表示(例如,通过从模板返回),并使用随机数增强它们。调用模板将根据关键字对返回的结果进行排序。我确信
libxslt
只对排序关键字的表达式求值一次,其他XSLT处理器可能也会这样做。因此,您的解决方案可以在不改变结构的情况下使用。谢谢-这是一个很好的开始。我现在正在吐,但中间什么也没有,我怀疑是因为里面有其他标记,而我们只选择文本?请用
“/*”
替换
“/text()”
。应该这样做。