1

在将 XML 转换为 HTML 时,我试图将外部参照元素作为链接输出,该链接带有自动生成的章节编号,该章节编号是从外部参照所指的章节元素中提取的。

例如,使用这样的 XML 源文件:

<chapter id="a_chapter">
  <title>Title</title>
  <para>...as seen in <xref linkend="some_other_chapter">.</para>
</chapter>

<chapter id="some_other_chapter">
  <title>Title</title>
  <para>Some text here.</para>
</chapter>

如果有两章,外部参照指的是第二章,则生成的 HTML 中的外部参照应输出如下:

<section id="a_chapter">
  <h1>Title</h1>
  <p>...as seen in <a href="#some_other_chapter">Chapter 2</a>.</p>
</section>

但我不确定如何计算外部参照 @linkend 引用的章节元素。我尝试使用 xsl:number,但无法在计数中使用 id() 函数:

<xsl:template match="xref">

  <xsl:variable name="label">
    <xsl:when test="id(@linkend)[self::chapter]"><xsl:text>Chapter </xsl:text></xsl:when>
  </xsl:variable

  <xsl:variable name="count">
    <xsl:if test="id(@linkend)[self::chapter]"><xsl:number count="id(@linkend)/chapter" level="any" format="1"/></xsl:if>
  </xsl:variable>

  <a href="#{@linkend}">
    <xsl:value-of select="$label"/><xsl:value-of select="$count"/>
  </a>
</xsl:template>

我还尝试仅使用“章节”作为 xsl:number 计数的值,但这会为所有输出生成“章节 0”。

我离这里很远,还是只是犯了一个愚蠢的xpath错误?任何帮助将不胜感激。

4

2 回答 2

1

在 XSLT 1.0 中,在调用之前更改上下文<xsl:number>

<xsl:for-each select="id(@linkend)">
  <xsl:number/>
</xsl:for-each>

select=在 XSLT 2.0 中,使用属性更改上下文:

<xsl:number select="id(@linkend)"/>
于 2013-07-29T22:36:48.743 回答
0

最简单的方法可能是使用模版模板chapter来生成标签。

小例子...

XML 输入

<doc>
    <chapter id="a_chapter">
        <title>Title</title>
        <para>...as seen in <xref linkend="some_other_chapter"/>.</para>
    </chapter>

    <chapter id="some_other_chapter">
        <title>Title</title>
        <para>Some text here.</para>
    </chapter>
</doc>

XSLT 1.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="xref">
        <a href="#{@linkend}">
            <xsl:apply-templates select="/*/chapter[@id=current()/@linkend]" mode="label"/>
        </a>
    </xsl:template>

    <xsl:template match="chapter" mode="label">
        <xsl:text>Chapter </xsl:text>
        <xsl:number/>
    </xsl:template>

</xsl:stylesheet>

输出

<doc>
   <chapter id="a_chapter">
      <title>Title</title>
      <para>...as seen in <a href="#some_other_chapter">Chapter 2</a>.</para>
   </chapter>
   <chapter id="some_other_chapter">
      <title>Title</title>
      <para>Some text here.</para>
   </chapter>
</doc>
于 2013-07-29T22:29:08.257 回答