1

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

我使用类似于以下模板的内容为我的 XML 标记生成一个 id,因此我可以将目录映射到我的文档:

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

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

是否可以为生成器播种(就像我认为通过将当前元素传递给函数所做的那样),或者生成一个每次运行转换时都保证相同的 id,例如树中的节点号或某物?

4

2 回答 2

2

假设 Saxon 9 实现 XSLT 2.0,正确的方法是编写一个样式表kop,以不同的模式处理您的元素两次,使用xsl:result-document. 在一次运行中,生成的 id 将是唯一的,因此对于您处理的输入元素,两个文件将具有相同的生成 id。

于 2013-11-07T21:22:26.200 回答
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)。

(我在 XsltCake.com 上使用浏览器 Firefox 25 进行了尝试。)

于 2013-11-07T21:51:03.623 回答