Skip to main content
 首页 » 编程设计

xml之比较xslt转换上的值

2025年12月25日30落叶无声

我正在像这样的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">标签上。 Ive问题位于位于不同网络元素中的节点之间进行比较。如果我使用 /catalogo/objetos/objeto/ubicacion/text(),我总是从node获得相同的值。谢谢您的帮助。

请您参考如下方法:

您确实应该在此处发布预期的输出。 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> 




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