2015-03-31 4 views
1

В следующем фрагменте xml у меня есть раздел со сноской и подраздел со сноской. Я хочу изменить нумерацию сносок последовательно, начиная с уровня бумаги/раздела, несмотря на то, что ФН не являются братьями и сестрамиполучить позицию узла-потомка от предка, не обязательно родственного брата

<?xml version='1.0' ?> 
<paper> 
    <section> 
     <title>My Main Section</title> 
     <para>My para with a <footnote num="1">text</footnote> footnote.</para> 
     <section> 
      <title>my subsection</title> 
      <para>more text with another <footnote num="1">more fn text.</footnote> footnote.</para> 
     </section> 
    </section> 
</paper> 

ожидаемый результат будет:

<?xml version='1.0' ?> 
<paper> 
<section><title>My Main Section</title> 
    <para>My para with a <footnote num="1">text</footnote> footnote.</para> 
    <section><title>my subsection</title> 
    <para>more text with another <footnote num="2">more fn text.</footnote>  footnote.</para> 
    </section> 
</section> 
</paper> 

Я пытался различные вещи с xsl: число, но не может заставить ничего работать. Ближайший я мог бы получить было следующее:

<?xml version='1.0'?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

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

<xsl:template match="footnote/@num"> 
    <xsl:attribute name="num"><xsl:value-of select="count(ancestor::paper/section//footnote)"/></xsl:attribute> 
</xsl:template> 

</xsl:stylesheet> 

, что дает правильный подсчет 2, но я не уверен, как указать, что «Я первый из двух сносок в этом главном разделе».

Я также пытался писать именованный шаблон так:

<xsl:template match="/paper/section"> 
    <section> 
     <xsl:call-template name="renumberFNs"/> 
     <xsl:apply-templates/> 
    </section> 
</xsl:template> 

<xsl:template name="renumberFNs"> 
    <xsl:for-each select=".//footnote/@num"> 
     <xsl:attribute name="num"><xsl:value-of select="position()"/></xsl:attribute> 
    </xsl:for-each> 
</xsl:template> 

но поставить @num на участке. Есть идеи?

+0

«Изменить нумерацию сносок, начинающихся на уровне бумаги/раздела, поэтому fn не являются братьями и сестрами *« Я не уверен, что это значит. Почему бы вам не опубликовать ожидаемый результат трансформации? –

+0

добавил ожидаемый выход, а также редактирование для ясности (я надеюсь :)) – badperson

ответ

3

Будет ли это работать на вас?

<xsl:template match="footnote/@num"> 
    <xsl:attribute name="num"> 
     <xsl:number count="footnote" level="any" from="paper/section"/> 
    </xsl:attribute> 
</xsl:template> 
+0

отлично, спасибо. Успокойся, чтобы я не выбрал это из документов, которые я искал – badperson

Смежные вопросы