Cómo usar el número xsl para contar elementos con el grupo

Voy a contar el paso de procedimiento en orden como se muestra a continuación. No estoy seguro de cómo implementar.

XML:

<mainProcedure>
    <proceduralStepAlts>
        <proceduralStep/>
        <proceduralStep/>
    </proceduralStepAlts>
    <proceduralStep/>
    <proceduralStepAlts>
        <proceduralStep>
            <proceduralStepAlts>
                <proceduralStep/>
                <proceduralStep/>
            </proceduralStepAlts>
        </proceduralStep>
        <proceduralStep/>
    </proceduralStepAlts>
</mainProcedure>

Válido para Esquema:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:xlink="http://www.w3.org/1999/xlink"  xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="mainProcedure" type="mainProcedureElemType"/>
    <xs:complexType name="mainProcedureElemType">
        <xs:choice maxOccurs="unbounded">
            <xs:element ref="proceduralStep"/>
            <xs:element ref="proceduralStepAlts"/>
        </xs:choice>
    </xs:complexType>
    <xs:element name="proceduralStep" type="proceduralStepElemType"/>
    <xs:complexType name="proceduralStepElemType">
        <xs:sequence>
            <xs:element ref="title"/>
            <xs:choice maxOccurs="unbounded" minOccurs="0">
                <xs:element ref="proceduralStep"/>
                <xs:element ref="proceduralStepAlts"/>
            </xs:choice>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="proceduralStepAlts" type="proceduralStepAltsElemType"/>
    <xs:complexType name="proceduralStepAltsElemType">
        <xs:sequence>
            <xs:element maxOccurs="unbounded" ref="proceduralStep"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

Salida deseada: 1 1 2 3 3.1 3.1 3.2 3 4

Por qué el resultado deseado: proceduralStepAlts que envuelve varios pasos de procedimiento, el conjunto se considera solo "uno" y, por lo tanto, cada paso de procedimiento se muestra con el mismo número de esquema.

preguntado el 11 de abril de 13 a las 04:04

¿Puede explicar por qué la salida debería ser 1 1 2 3 3 ? ¿Cuál es la lógica en la asignación de estos números? Esto no está claro en absoluto a partir de la pregunta. -

El resultado se debe a que proceduralStepAlts envuelve varios pasos de procedimiento, el conjunto se considera solo "uno" y, por lo tanto, cada paso de procedimiento se muestra con el mismo número de esquema. -

user2268666, según su explicación, mi respuesta hace exactamente eso. ¿Te ha resultado útil mi respuesta o sigues teniendo algún problema? -

3 Respuestas

Esta hoja de estilo:

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

    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="proceduralStepAlts">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="proceduralStep[parent::proceduralStepAlts]">
        <xsl:value-of select="
                count(parent::proceduralStepAlts/preceding-sibling::proceduralStepAlts)
              + count(parent::proceduralStepAlts/preceding-sibling::proceduralStep)
              + 1"/>                
        <xsl:text> </xsl:text>
    </xsl:template>

    <xsl:template match="proceduralStep[parent::mainProcedure]">
        <xsl:value-of select="
              count(preceding-sibling::proceduralStepAlts)
            + count(preceding-sibling::proceduralStep)
            + 1"/>                
        <xsl:text> </xsl:text>
    </xsl:template>

</xsl:stylesheet>

produce la salida deseada con la entrada proporcionada.

Respondido 11 Abr '13, 05:04

Esta transformación:

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

 <xsl:template match="proceduralStepAlts/proceduralStep">
  <xsl:value-of select=
  "concat(count(../preceding-sibling::*) +1, ' ')"/>
 </xsl:template>

 <xsl:template match="/*/proceduralStep">
  <xsl:value-of select=
   "concat(count(preceding-sibling::*) +1, ' ')"/>
 </xsl:template>
</xsl:stylesheet>

cuando se aplica en el documento XML proporcionado:

<mainProcedure>
    <proceduralStepAlts>
        <proceduralStep/>
        <proceduralStep/>
    </proceduralStepAlts>
    <proceduralStep/>
    <proceduralStepAlts>
        <proceduralStep/>
        <proceduralStep/>
    </proceduralStepAlts>
</mainProcedure>

produce el resultado deseado:

1 1 2 3 3 

Segunda solución:

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

 <xsl:template match="/*">
   <xsl:apply-templates select="*[self::proceduralStep or proceduralStep]"/>
 </xsl:template>

 <xsl:template match="proceduralStep | proceduralStepAlts">
  <xsl:variable name="vPos" select="position()"/>

  <xsl:for-each select="self::proceduralStep | proceduralStep">
   <xsl:value-of select="concat($vPos, ' ')"/>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

Cuando esta transformación se aplica en el mismo documento XML (arriba), se produce el mismo resultado correcto:

1 1 2 3 3 

Respondido 11 Abr '13, 06:04

Creo que solo está contando los elementos debajo del elemento raíz, por lo que podría usar esta expresión

<xsl:number count="/*/*" />

Aquí está el XSLT 'completo'

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="text"/>

   <xsl:template match="proceduralStep">
      <xsl:number count="/*/*" />
   </xsl:template>
</xsl:stylesheet>

Cuando se aplica a su XML, se genera lo siguiente:

11233

Respondido 11 Abr '13, 08:04

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