如何从xslt中的内容首字母序列生成ID?

时间:2009-08-31 08:10:58

标签: xslt

我需要使用内容前三个字母为引用的位置生成TOC部件的序列ID和idref。

输入:

<tocentry><title>List of Boxed Readings</title></tocentry>
<tocentry><title>Foreword</title></tocentry>
<tocentry><title>About the Author</title></tocentry>
<tocentry><title>Preface</title></tocentry>
<tocentry><title>A Dinosaur Dictionary</title></tocentry>
<tocentry><title>GLOSSARY</title></tocentry>
<tocentry><title>INDEX</title></tocentry>

必需的输出:

<p class="Toc-part"><a href="#LOBRSec1">List of Boxed Readings</a></p>
<p class="Toc-part"><a href="#ForeSec2">Foreword</a></p>
<p class="Toc-part"><a href="#AtASec3">About the Author</a></p>
<p class="Toc-part"><a href="#PrefSec4">Preface</a></p>
<p class="Toc-part"><a href="#ADDSec5">A Dinosaur Dictionary</a></p>
<p class="Toc-part"><a href="#GLOSSec6">GLOSSARY</a></p>
<p class="Toc-part"><a href="#INDXSec7">INDEX</a></p>

请帮我从内容首字母生成ID ...

祝你好运, 安东尼

3 个答案:

答案 0 :(得分:1)

由于我不明白为什么你会想要一个已经 唯一的ID中的任意字母组合,我不推荐这样做,并且说你改用它:

<xsl:template match="tocentry">
  <p class="Toc-part">
    <xsl:apply-templates select="title" />
  </p>
</xsl:template>

<xsl:template match="title">
  <a href="#Sec{count(preceding-sibling::title) + 1}">
    <xsl:value-of select="." />
  </a>
</xsl:template>

答案 1 :(得分:1)

这个问题永远无法解决,因为它没有正确制定。您没有提出生成ID的严格规则 - 例如,为什么INDX而不是INDE?为什么选择ATA而不是ATAU?

这个问题有一个优雅的解决方案,由该语言的设计者提供给XSLT。请阅读generate-id()函数并使用它来生成ID。

答案 2 :(得分:0)

您可以使用标准字而不是ID

中的内容

例如,如果它是frontmatter使用“FMSec1,FMSec2,FMSec3 ..... FMSecN ..”

“FM”将与其他人不同......