2008-09-15 20 views
8

Dado el siguiente código XML:partido bajo condición de que el valor nodo actual

<current> 
    <login_name>jd</login_name> 
</current> 
<people> 
    <person> 
    <first>John</first> 
    <last>Doe</last> 
    <login_name>jd</login_name> 
    </preson> 
    <person> 
    <first>Pierre</first> 
    <last>Spring</last> 
    <login_name>ps</login_name> 
    </preson> 
</people> 

¿Cómo puedo obtener "John Doe" desde dentro de la matcher/inicio de sesión actual?

He intentado lo siguiente:

<xsl:template match="current/login_name"> 
    <xsl:value-of select="../people/first[login_name = .]"/> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="../people/last[login_name = .]"/> 
</xsl:template> 

Respuesta

10

Me defino una clave para indexar las personas:

<xsl:key name="people" match="person" use="login_name" /> 

Usando una clave aquí simplemente mantiene el código limpio, pero también puede resultar útil para la eficiencia si está a menudo tener que recuperar el <person> elementos basados ​​en su hijo <login_name>.

tendría una plantilla que devuelve el nombre de un formato determinado <person>:

<xsl:template match="person" mode="name"> 
    <xsl:value-of select="concat(first, ' ', last)" /> 
</xsl:template> 

Y entonces yo haría:

<xsl:template match="current/login_name"> 
    <xsl:apply-templates select="key('people', .)" mode="name" /> 
</xsl:template> 
+0

Bueno, ignora mi respuesta más abajo, esta es genial.Limpio y compuesto de agradables partes reutilizables. –

+0

¡me encanta! gracias ... nunca escuché sobre la tecla xsl: antes ... –

0

Creo que lo que en realidad quería era la sustitución en el partido por el nodo "actual", no un partido en el nodo persona:

<xsl:variable name="login" select="//current/login_name/text()"/> 

<xsl:template match="current/login_name"> 
<xsl:value-of select='concat(../../people/person[login_name=$login]/first," ", ../../people/person[login_name=$login]/last)'/> 

</xsl:template> 
4

¿quieres current() función

<xsl:template match="current/login_name"> 
    <xsl:value-of select="../../people/person[login_name = current()]/first"/> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="../../people/person[login_name = current()]/last"/> 
</xsl:template> 

o un poco más limpio:

<xsl:template match="current/login_name"> 
    <xsl:for-each select="../../people/person[login_name = current()]"> 
    <xsl:value-of select="first"/> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="last"/> 
    </xsl:for-each> 
</xsl:template> 
+0

THX por la punta actual ... incluso si realmente no me gusta el uso de for-each en xslt ... –

0

sólo para añadir mis pensamientos a la pila

<xsl:template match="login_name[parent::current]"> 
<xsl:variable name="login" select="text()"/> 
<xsl:value-of select='concat(ancestor::people/child::person[login_name=$login]/child::first/text()," ",ancestor::people/child::person[login_name=$login]/child::last/text())'/> 
</xsl:template> 

siempre prefiero utilizar los ejes de forma explícita en mi XPath, más prolija, pero más claro en mi humilde opinión.

Dependiendo de cómo se vea el resto de los documentos XML (asumiendo que esto es solo un fragmento) puede necesitar restringir la referencia a "ancestro :: personas" por ejemplo usando "ancestor :: people [1]" para restringir a la primera gente ancestro.

1

Si necesita acceder a varios usuarios, JeniT's <xsl:key /> approach es ideal.

Aquí está mi opinión sobre ella alternativa:

<xsl:template match="current/login_name"> 
    <xsl:variable name="person" select="//people/person[login_name = .]" /> 
    <xsl:value-of select="concat($person/first, ' ', $person/last)" /> 
</xsl:template> 

Asignamos el <person> nodo seleccionado a una variable, entonces usamos la función concat() a la salida de los primeros/apellidos.

También hay un error en su XML de ejemplo. El nodo <person> termina de forma incorrecta con </preson> (error tipográfico)

Una mejor solución podría darse si sabíamos la estructura general del documento XML (con nodos raíz, etc.)

+0

gracias por la sugerencia ... funciona muy bien ... no sé por qué, no me gusta usar variables en xslt ... –

Cuestiones relacionadas