使用XSLT生成可重现的id

时间:2013-11-07 21:07:50

标签: xml xslt xslt-1.0

我有一个XML文档,我将其转换为两个文档:一个目录,一个实际内容。

我使用类似下面的模板为我的XML标签生成一个id,所以我可以将目录映射到我的文档:

<xsl:template match="kop">
  <sometag id="{generate-id(.)}" />
</xsl:template>

然而,使用Saxon进行处理不会创建可靠的可重现ID。 (例如,多次运行会给出不同的ID。)

是否有可能为生成器播种(就像我以为通过将当前元素传递给函数来完成),或者生成一个每次运行转换时保证相同的id,如节点号树还是什么?

2 个答案:

答案 0 :(得分:2)

假设Saxon 9实现XSLT 2.0,正确的方法是编写一个样式表,在不同模式下处理kop元素两次,使用xsl:result-document创建两个结果文档。在单次运行中,生成的id将是唯一的,因此两个文件将为您处理的输入元素生成相同的生成ID。

答案 1 :(得分:2)

也许您的处理允许使用xsl:number的简单编号节点,如下所示:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="kop">
    <xsl:variable name="id">
      <xsl:number level="single" count="kop"/>
    </xsl:variable>
    <sometag id="ID{$id}" />
  </xsl:template>
</xsl:stylesheet>

输入

<root>
  <kop/>
  <kkk/>
  <kop/>
</root>

上述XSLT输出

<sometag id="ID1"></sometag>
<sometag id="ID2"></sometag>

您可以使用count="kop|kkk"之类的内容在编号中包含其他元素(示例结果在ID3而非第二行中的ID2)。

(我在浏览器Firefox 25的XsltCake.com上尝试过它。)