XSL apply-templates funciona también con elementos que no coinciden.
Tengo una entrada Xml como esta:
<?xml version="1.0" encoding="UTF-8"?>
<Merge>
<Object>
<Value name="Name" type="Number">Hans</Value>
<Value name="Vorname" type="Number">Peter</Value>
<Value name="Gebort" type="Number">Germany</Value>
</Object>
<Data>
<getGender>
<get_Gender>male</get_Gender>
</getGender>
</Data>
</Merge>
Y un xsl como este:
<?xml version="1.0" encoding="UTF-8"?gt;
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output media-type="text/xml" method="xml"></xsl:output>
<xsl:template match="/">
<Features>
<xsl:apply-templates></xsl:apply-templates>
<Feature name="gender"><xsl:value-of select="//get_Gender"></xsl:value-of></Feature>
</Features>
</xsl:template>
<xsl:template match="Value">
<Feature name="{@name}"><xsl:value-of select="."></xsl:value-of></Feature>
</xsl:template>
</xsl:stylesheet>
<p>Mi salida es: </p>
<Features>
<Feature name="Name">Hans</Feature>
<Feature name="Vorname">Peter</Feature>
<Feature name="Gebort">Germany</Feature>
male
<Feature name="gender">male</Feature>
</Features>
Pero ¿por qué?
Me gustaría tener algo como esto:
<Features>
<Feature name="Name">Hans</Feature>
<Feature name="Vorname">Peter</Feature>
<Feature name="Gebort">Germany</Feature>
<Feature name="gender">male</Feature>
</Features>
¿Por qué hay un “male” aleatorio en mi salida? Creo que tiene algo que ver con
<apply-templates>
pero no sé por qué se comporta de esta manera.
davy.ai
El “hombre” aleatorio en el resultado se debe a la
<xsl:apply-templates>
en la primera plantilla. Esto aplica plantillas a todos los nodos hijos de la raíz, lo que incluye el nodo<get_gender>
en la sección<data>
. Este nodo es procesado por la segunda plantilla, que crea un elemento<feature>
con el valor “hombre” y lo agrega al resultado.Para obtener el resultado deseado, puede eliminar la
<xsl:apply-templates>
de la primera plantilla y en su lugar llamar explícitamente a la segunda plantilla para cada nodo<value>
utilizando<xsl:apply-templates select="Object/Value">
. Esto procesará solo los nodos<value>
y creará un elemento<feature>
para cada uno. Luego, después de procesar los nodos<value>
, puede agregar el elemento<feature>
para “género” fuera de cualquier plantilla, de esta manera:De esta manera, el resultado será:
que es el resultado deseado.