我有一个XML文档,我将其转换为两个文档:一个目录,一个实际内容。
我使用类似下面的模板为我的XML标签生成一个id,所以我可以将目录映射到我的文档:
<xsl:template match="kop">
<sometag id="{generate-id(.)}" />
</xsl:template>
然而,使用Saxon进行处理不会创建可靠的可重现ID。 (例如,多次运行会给出不同的ID。)
是否有可能为生成器播种(就像我以为通过将当前元素传递给函数来完成),或者生成一个每次运行转换时保证相同的id,如节点号树还是什么?
答案 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上尝试过它。)