比较xslt转换的值

时间:2014-06-21 17:42:10

标签: xml xslt xpath

我正在使用像这样的XML

<!DOCTYPE catalogo SYSTEM "catalogo.dtd">
<catalogo>
    <constelaciones>
        <constelacion situacion="boreal">
            <nombrelatino>Ursa Major</nombrelatino>
            <nombrecomun>Osa Mayor</nombrecomun>
            <abreviatura>UMa</abreviatura>
            <genitivo>Ursae Majoris</genitivo>
            <visibilidad>Circumpolar</visibilidad>
            <imagen>img/uma.jpg</imagen>
        </constelacion>
        <constelacion situacion="boreal">
            <nombrelatino>Andromeda</nombrelatino>
            <nombrecomun>Andromeda</nombrecomun>
            <abreviatura>And</abreviatura>
            <genitivo>Andromedae</genitivo>
            <visibilidad>Otonio</visibilidad>
            <imagen>img/and.jpg</imagen>
        </constelacion>
        <constelacion situacion="austral">
            <nombrelatino>Crux</nombrelatino>
            <nombrecomun>La Cruz del Sur</nombrecomun>
            <abreviatura>Cru</abreviatura>
            <genitivo>Crucis</genitivo>
            <visibilidad>Circumpolar</visibilidad>
            <imagen>img/cru.jpg</imagen>
        </constelacion>
        <constelacion situacion="boreal">
            <nombrelatino>Cygnus</nombrelatino>
            <nombrecomun>El Cisne</nombrecomun>
            <abreviatura>Cyg</abreviatura>
            <genitivo>Cygni</genitivo>
            <visibilidad>Verano</visibilidad>
            <imagen>img/cyg.jpg</imagen>
        </constelacion>
    </constelaciones>

    <objetos>
        <objeto observacion="telescopio" clase="galaxia">
            <codigo>M82</codigo>
            <ubicacion>Osa Mayor</ubicacion>
            <magnitud>8.41</magnitud>
            <imagen>img/m82.jpg</imagen>
        </objeto>
        <objeto observacion="binocular" clase="cumulo">
            <codigo>M45</codigo>
            <denominacion>Pleyades</denominacion>
            <ubicacion>Tauro</ubicacion>
            <magnitud>1.6</magnitud>
            <imagen>img/m45.jpg</imagen>
        </objeto>
            <objeto observacion="telescopio" clase="nebulosa">
            <codigo>NGC6826</codigo>
            <ubicacion>El Cisne</ubicacion>
            <magnitud>10</magnitud>
            <imagen>img/ngc6826.jpg</imagen>
        </objeto>
            <objeto observacion="binocular" clase="galaxia">
            <codigo>M31</codigo>
            <denominacion>Galaxia de Andromeda</denominacion>
            <ubicacion>Andromeda</ubicacion>
            <magnitud>4.36</magnitud>
            <imagen>img/m31.jpg</imagen>
        </objeto>
    </objetos>

    <telescopios>
        <telescopio tipo="refractor">
            <marca>SkyWatcher </marca>
            <modelo></modelo>
            <precio>620</precio>
            <potencia>12.5</potencia>
            <imagen>img/sky.jpg</imagen>
        </telescopio>
        <telescopio tipo="reflector">
            <marca>Orion</marca>
            <modelo>SkyQuest XX12</modelo>
            <precio>1595</precio>
            <potencia>15.1</potencia>
            <imagen>img/orion.jpg</imagen>
        </telescopio>
        <telescopio tipo="binocular">
            <marca>Celestron</marca>
            <modelo>Skymaster 700</modelo>
            <precio>190</precio>
            <potencia>9</potencia>
            <imagen>img/celestron.jpg</imagen>
        </telescopio>
    </telescopios>
</catalogo>

和Xsl样式表

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" encoding="utf-8" doctype-system="about:legacy-compat" />
  <xsl:template match="catalogo">
    <html>
      <head>
        <title>Ejercicio 5 Catálogo Estelar</title>
        <link rel="stylesheet" type="text/css" href="css/estilos_catalogo.css"></link>
      </head>
      <body>
        <header>
            <h1>CATÁLOGO ESTELAR</h1>
        </header>
        <xsl:for-each select="constelaciones/constelacion">
            <div>
                <xsl:attribute name="class">constelacion</xsl:attribute>
                <div>
                    <xsl:attribute name="class">descripcion</xsl:attribute>
                    <img>
                        <xsl:attribute name="src">
                            <xsl:value-of select="imagen"/>
                        </xsl:attribute>
                        <xsl:attribute name="alt">
                            <xsl:value-of select="nombrecomun"/>
                        </xsl:attribute>
                        <xsl:attribute name="title">
                            <xsl:value-of select="nombrecomun"/>
                        </xsl:attribute>
                    </img>

                    <h2><xsl:value-of select="nombrelatino"/></h2>
                    <p><xsl:value-of select="nombrecomun"/></p>
                    <p><xsl:value-of select="abreviatura"/></p>
                    <p><xsl:value-of select="genitivo"/></p>
                    <p><xsl:value-of select="visibilidad"/></p>
                </div>
                <div>
                    <xsl:attribute name="class">objetos</xsl:attribute>
                        <xsl:if test="/catalogo/objetos/objeto/ubicacion/text()=nombrecomun/text()">
                            <p><xsl:value-of select="codigo"/></p>
                            <p><xsl:value-of select="magnitud"/></p>
                            <xsl:if test="denominacion">
                                <p><xsl:value-of select="denominacion"/></p>
                            </xsl:if>
                            <img>
                                <xsl:attribute name="src">
                                    <xsl:value-of select="imagen"/>
                                </xsl:attribute>
                                <xsl:attribute name="alt">
                                    <xsl:value-of select="codigo"/>
                                </xsl:attribute>
                                <xsl:attribute name="title">
                                    <xsl:value-of select="codigo"/>
                                </xsl:attribute>
                            </img>
                        </xsl:if>
                </div>
            </div>
        </xsl:for-each>
        <footer>
            <p>José Manuel</p>
            <p>Transformación XSLT</p>
        </footer>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

我需要显示所有星座,并显示与每个星座对应的对象。将<nombrecomun><ubicacion>进行比较。对象隐藏在<div class="objeto">标签上。我在位于不同元素中的节点之间的比较存在问题。如果我使用/catalogo/objetos/objeto/ubicacion/text(),我将从节点获得相同的值。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

你真的应该在这里发布您的预期输出。 Minimizing这个例子也很有帮助。

现在,我建议您使用来获取与每个星座相关的对象。为此,请添加以下内容:

<xsl:key name="object" match="objeto" use="ubicacion" />

到样式表的顶部,在任何模板之外。然后改变这个:

<xsl:if test="/catalogo/objetos/objeto/ubicacion/text()=nombrecomun/text()">
    <p><xsl:value-of select="codigo"/></p>
    <p><xsl:value-of select="magnitud"/></p>
    <xsl:if test="denominacion">
        <p><xsl:value-of select="denominacion"/></p>
    </xsl:if>
    <img>
        <xsl:attribute name="src">
            <xsl:value-of select="imagen"/>
        </xsl:attribute>
        <xsl:attribute name="alt">
            <xsl:value-of select="codigo"/>
        </xsl:attribute>
        <xsl:attribute name="title">
            <xsl:value-of select="codigo"/>
        </xsl:attribute>
    </img>
</xsl:if>

为:

<xsl:for-each select="key('object', nombrecomun)">
    <p><xsl:value-of select="codigo"/></p>
    <p><xsl:value-of select="magnitud"/></p>
    <xsl:if test="denominacion">
        <p><xsl:value-of select="denominacion"/></p>
    </xsl:if>
    <img>
        <xsl:attribute name="src">
            <xsl:value-of select="imagen"/>
        </xsl:attribute>
        <xsl:attribute name="alt">
            <xsl:value-of select="codigo"/>
        </xsl:attribute>
        <xsl:attribute name="title">
            <xsl:value-of select="codigo"/>
        </xsl:attribute>
    </img>
</xsl:for-each>

P.S。如果您学习使用属性值模板,则可以大大缩短代码。