1

我有一个简单的 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?__
4

1 回答 1

1

一种方法是使用函数 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,因此实际上标题会被“打乱”。:-)
于 2013-10-21T22:33:20.903 回答