A partir del elemento de referencia, obtenga el recuento de las ocurrencias del elemento anterior dentro del ancestro

Estoy tratando de determinar el número de figura contenido en el capítulo actual a partir de la referencia a la figura.

Requisitos:

  • El número de figura debe restablecerse para cada capítulo.
  • Referencias de figuras, <figure_reference>, puede ocurrir a cualquier profundidad.
  • XSLT 1.0

XML:

<top>
    <chapter>
        <dmodule>
            <paragraph>
                <figure>figure</figure>
            </paragraph>
            <figure>figure</figure>
        </dmodule>
    </chapter>
    <chapter>
        <dmodule>
            <figure>figure</figure>
            <paragraph>
                <figure>figure</figure>
            </paragraph>
        </dmodule>
        <dmodule>
            <figure>figure</figure>
            <paragraph>
                <figure>figure</figure>
                <paragraph>
                    <figure>figure</figure>
                </paragraph>
            </paragraph>
            <figure_reference id="c"/>
            <figure id="c">figure</figure>
        </dmodule>
    </chapter>
</top>

XSL:

<xsl:template match="figure_reference">
    <xsl:value-of select="count(ancestor::dmodule//figure[@id = current()/@id]/preceding::figure)+1"/>

</xsl:template>

Conteo actual Resultados: 8

Resultado de conteo deseado: 6

preguntado el 02 de mayo de 12 a las 19:05

2 Respuestas

Prueba esta plantilla:

  <xsl:template match="figure_reference">
    <xsl:value-of select="count(ancestor::chapter//figure[@id=current()/@id]/preceding::figure[ancestor::chapter = current()/ancestor::chapter])+1"/>      
  </xsl:template>

contestado el 02 de mayo de 12 a las 19:05

Otra forma de hacer esto no requiere descifrar expresiones XPath complicadas, usando <xsl:number>:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:key name="kFigById" match="figure" use="@id"/>

 <xsl:template match="figure_reference">

  <xsl:for-each select="key('kFigById', @id)">
      <xsl:number level="any" count="chapter//figure"
                from="chapter"/>
  </xsl:for-each>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

Cuando esta transformación se aplica al documento XML proporcionado:

<top>
    <chapter>
        <dmodule>
            <paragraph>
                <figure>figure</figure>
            </paragraph>
            <figure>figure</figure>
        </dmodule>
    </chapter>
    <chapter>
        <dmodule>
            <figure>figure</figure>
            <paragraph>
                <figure>figure</figure>
            </paragraph>
        </dmodule>
        <dmodule>
            <figure>figure</figure>
            <paragraph>
                <figure>figure</figure>
                <paragraph>
                    <figure>figure</figure>
                </paragraph>
            </paragraph>
            <figure_reference id="c"/>
            <figure id="c">figure</figure>
        </dmodule>
    </chapter>
</top>

se produce el resultado deseado y correcto:

6

contestado el 03 de mayo de 12 a las 02:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.