利用XSLT产生一个唯一的ID并引用它

原创 2002年05月17日 17:11:00

Generating Unique IDs and Linking to Them

When an XSLT stylesheet converts one XML document into another, the ability to add unique ID values to elements in the result document can make the result document much more useful to applications that use it. Adding unique IDs can, for example, turn each element into the unique target of a link.

XSLT's generate-id() function generates a unique ID for a node passed to it as an argument. This ID starts with a letter so that you can use it as the value of an XML ID attribute. For example, the following stylesheet copies an XML document and adds a uid ("unique ID") attribute to each chapter, sect1, and sect2 element. The xsl:value-of instruction uses the generate-id() function in the stylesheet's first template rule to create a value for these attributes.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     version=
"1.0"><xsl:output method="xml" omit-xml-declaration="yes"/>
  <xsl:template match="chapter | sect1 | sect2">
    <xsl:copy>
      <xsl:attribute name="uid">
        <xsl:value-of select="generate-id(.)"/>
      </xsl:attribute>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

The stylesheet turns this XML document

<chapter>
<para>Then with expanded wings he steers his flight</para>
<figure><title>"Incumbent on the Dusky Air"</title>
<graphic fileref="pic1.jpg"/></figure>
<para>Aloft, incumbent on the dusky Air</para>
<sect1>
<para>That felt unusual weight, till on dry Land</para>
<figure><title>"He Lights"</title>
<graphic fileref="pic2.jpg"/></figure>
<para>He lights, if it were Land that ever burned</para>
<sect2>
<para>With solid, as the Lake with liquid fire</para>
<figure><title>"The Lake with Liquid Fire"</title>
<graphic fileref="pic3.jpg"/></figure>
</sect2>
</sect1>
</chapter>
into this one:

<chapter uid="N134711680">
<para>Then with expanded wings he steers his flight</para>
<figure><title>"Incumbent on the Dusky Air"</title>
<graphic fileref="pic1.jpg"/></figure>
<para>Aloft, incumbent on the dusky Air</para>
<sect1 uid="N134683456">
<para>That felt unusual weight, till on dry Land</para>
<figure><title>"He Lights"</title>
<graphic fileref="pic2.jpg"/></figure>
<para>He lights, if it were Land that ever burned</para>
<sect2 uid="N134684064">
<para>With solid, as the Lake with liquid fire</para>
<figure><title>"The Lake with Liquid Fire"</title>
<graphic fileref="pic3.jpg"/></figure>
</sect2>
</sect1>
</chapter>

Your XSLT processor may generate different values with the generate-id() function. In fact, if you run the same stylesheet with the same input document a second time, the XSLT processor may not generate the same ID values that it generated the first time. However, if you call generate-id() more than once in one run with the same node as an argument, it generates the same ID value each time for that node. Because unique IDs are popular ways to identify link destinations, this consistency of the generate-id() function makes it a great way to generate links.

For example, adding a list of all of its illustrations at the beginning of the result document. If we make the result tree version an HTML file, we can use the generate-id function to turn each entry of this opening illustration list into an HTML link to the img element in the body of the document that has the illustration:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     version="1.0">
  <xsl:output method="html"/>
  <xsl:template match="chapter">
    <html><body>
      <!-- Generate a list of picture titles, with each 
           title linking to the picture in the poem below. -->
      <b>Pictures:</b><br/>
      <xsl:for-each select="descendant::figure">
        <a href="#{generate-id(graphic)}">
        <xsl:value-of select="title"/></a><br/>
    </xsl:for-each>
    <xsl:apply-templates/>
    </body></html>
  </xsl:template>
  <xsl:template match="para">
    <p><xsl:apply-templates/></p>
  </xsl:template>
  <xsl:template match="graphic">
    <!-- Image and title as caption, centered. -->
    <center><a name="{generate-id(.)}"><img src="{@fileref}"/></a>
    <b><xsl:value-of select="../title"/></b></center>
  </xsl:template>
  <!-- Suppress figure title because "graphic" template
       rule already added it to result tree. -->
  <xsl:template match="figure/title"/>
</xsl:stylesheet>

With the source document above, this stylesheet creates the following HTML document:

<html>
    <body>
        <b>Pictures:</b>
        <br>
        <a href="#N134691840">"Incumbent on the Dusky Air"</a>
        <br>
        <a href="#N134692416">"He Lights"</a>
        <br>
        <a href="#N134757920">"The Lake with Liquid Fire"</a>
        <br>
<p>Then with expanded wings he steers his flight</p>
<center>
            <a name="N134691840"><img src="pic1.jpg"></a>
            <b>"Incumbent on the Dusky Air"</b>
        </center>
<p>Aloft, incumbent on the dusky Air</p>
<p>That felt unusual weight, till on dry Land</p>
<center>
            <a name="N134692416"><img src="pic2.jpg"></a>
            <b>"He Lights"</b>
        </center>
<p>He lights, if it were Land that ever burned</p>
<p>With solid, as the Lake with liquid fire</p>
<center>
            <a name="N134757920"><img src="pic3.jpg"></a>
            <b>"The Lake with Liquid Fire"</b>
        </center>

</body>
</html>

(To view the HTML document, you'll need to supply your own pic1.jpg, pic2.jpg, and pic3.jpg files.) The stylesheet uses the generate-id() ID twice:

This consistency in the generate-id() function's treatment of a particular node, even if the function generates an ID for that node more than once, is the key to its power. These graphic elements didn't have IDs in the source document; with the help of this function, their equivalent in the result document has them, and other elements in that document use those IDs to link to them.

利用XSLT产生一个唯一的ID并引用它

Generating Unique IDs and Linking to ThemWhen an XSLT stylesheet converts one XML document into an...
  • hejishan
  • hejishan
  • 2008年03月11日 12:22
  • 197

如何生成一个唯一的ID值

空间对象的数据库表包括事务表(BUSINESS TABLE),要素表(FEATURE TABLE),空间索引表(SPATIAL INDEX TABLE)。事务表(BUSINESS TABLE)中有一个...
  • heyubingzju
  • heyubingzju
  • 2006年04月05日 21:01
  • 2394

java唯一无序id生成

1、背景介绍   在许多项目中ID号是一个永恒的主题。在绝大多数情况下,这个唯一ID产生相对比较容易,毕竟现在众多的项目都是基于数据库的,只要把数据库的主键拿出来作为ID就可以确保ID在整个系统...
  • xiaomojun
  • xiaomojun
  • 2015年12月16日 13:23
  • 7331

高并发下使用Redis生成唯一id

最近使用spirngcloud来搭建分布式项目,遇到插入重复问题,决定用redis生成唯一ID来解决。 /** * 获取唯一Id * @param key * @p...
  • heroguo007
  • heroguo007
  • 2017年11月09日 15:32
  • 616

python生成12位唯一标识

一直在用uuid作为数据库id,但是长度太长,所以做个简单的唯一标识试下# -*- coding: utf-8 -*- import datetime,time,random#10进制转换36进制 d...
  • qf0129
  • qf0129
  • 2016年12月19日 05:21
  • 1308

在高并发分布式系统中生成全局唯一Id

单独开一个数据库,获取全局唯一的自增序列号或各表的MaxId 1)         使用自增序列号表 专门一个数据库,生成序列号。开启事物,每次操作插入时,先将数据插入到序列表并返回自增序列号用于...
  • nic7968
  • nic7968
  • 2015年07月14日 01:01
  • 566

java生成唯一ID简单方法

通过计算机名字和时间戳来生成一个唯一的ID public static String generateRefID() { Date now = new Date(); SimpleDateF...
  • xiaofeixia22222
  • xiaofeixia22222
  • 2012年08月24日 16:56
  • 3749

Python进阶学习笔记——函数式编程之返回函数&闭包

自己记录一下,以便理解的更加深刻,总结的是慕课网廖老师的Python进阶课程,多多指教~...
  • JOEY_berlin
  • JOEY_berlin
  • 2017年09月03日 22:05
  • 155

分布式系统中生成全局唯一ID的3个思路

分布式系统中生成全局唯一ID的3个思路       本文根据http://chuansong.me/n/950274251672总结而来! 1.  基于数据库的生成       ...
  • chenglinhust
  • chenglinhust
  • 2016年10月12日 22:41
  • 1816

linux生成uuid全球唯一标识码方法

环境:ubuntu10.04  http://blog.csdn.net/liuchangyu23/article/details/4486794 安装libuuid动态库 sudo apt-g...
  • xtx1990
  • xtx1990
  • 2012年11月12日 13:28
  • 1679
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用XSLT产生一个唯一的ID并引用它
举报原因:
原因补充:

(最多只允许输入30个字)