2013-07-29 5 views
1

При преобразовании XML в HTML я пытаюсь вывести элемент xref как ссылку с автоматически сгенерированным номером главы, который извлекается из элемента главы, к которому относится ссылка xref.Функция XSL id() внутри xsl: число count

Например, с исходного 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: номер, но я не могу использовать функцию идентификатора() в графе:

<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, и для каждого решения работало для меня. Очень признателен! – je55ika

0

Что может быть самым простым путем было бы использовать шаблон для chapter для создания ярлыка.

Небольшой пример ...

XML Input

<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> 
Смежные вопросы