2013-07-29 43 views
1

將XML轉換爲HTML時,我試圖將xref元素作爲鏈接輸出,並且自動生成的章節編號從xref引用的章節元素中提取。xsl:number count中的XSL id()函數

例如,使用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> 

但我不確定如何計算xref @linkend引用的章節元素。我嘗試使用XSL:數字,但我無法用數內的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的價值也嘗試:數數,但爲所有產出製作了「第0章」。

我在這裏,或只是做一個愚蠢的xpath錯誤?任何幫助將不勝感激。

+0

我認爲你正在使用'count'錯誤。請使用合適的解決方案,例如http://stackoverflow.com/questions/5877193/xslnumber-count-not-working-as-expected-issue-with-my-xpath – kan

回答

1

在XSLT 1.0,調用<xsl:number>之前更改背景:

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

在XSLT 2.0,與select=屬性更改背景:

<xsl:number select="id(@linkend)"/> 
+0

謝謝你的徹底答案。我使用的是XSLT 1.0,for-each解決方案適用於我。非常感激! – je55ika

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>