如果您最终使用了XSLT,则可以找到
generate-id
用于生成ID的函数。
下面是一个使用XSLT1.0的伪示例:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="element-by-id" match="//*" use="@id"/>
<!-- identity transform: everything as-is... -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- ... except for rewritten id's -->
<xsl:template match="@id">
<xsl:attribute name="id">
<xsl:value-of select="generate-id(..)"/>
</xsl:attribute>
</xsl:template>
<!-- ... and rewritten id references -->
<xsl:template match="@ref">
<xsl:variable name="head" select="substring-before(., 'url(#')"/>
<xsl:variable name="tail" select="substring-after(., 'url(#')"/>
<xsl:variable name="idref" select="substring-before($tail, ')')"/>
<xsl:variable name="end" select="substring-after($tail, ')')"/>
<xsl:attribute name="ref">
<xsl:value-of select="concat($head, 'url(#',
generate-id(key('element-by-id', $idref)),
')', $end)"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
如果你不喜欢由
生成ID
(或者,如果您由于其他原因不能使用它——为了确保获得唯一的ID,需要在同一转换中处理所有节点),您可以用其他逻辑替换对它的调用,例如添加后缀。