Cómo usar el número xsl para contar elementos con el grupo
Frecuentes
Visto 1,438 equipos
1
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.
3 Respuestas
0
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
0
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
0
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 xslt or haz tu propia pregunta.
¿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. - Dimitre NovatchevEl 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
user2268666, según su explicación, mi respuesta hace exactamente eso. ¿Te ha resultado útil mi respuesta o sigues teniendo algún problema? - Dimitre Novatchev