XSLT以不同的xml读取顺序应用模板

我是新手,所以请耐心等待……

如果我们有以下xml片段:

<docXML>
<PARRAFO orden='1' tipo='parrafo'>
    <dato>
      <etiqueta>Título</etiqueta>
      <tipo>TextBox</tipo>
      <valor>¿Cuándo solicitar el consejo genético?</valor>
      <longitud>1500</longitud>
      <comentario></comentario>
      <enlace></enlace>
      <target_enlace>I</target_enlace>
    </dato>
    <dato>
      <etiqueta>Texto</etiqueta>
      <tipo>Resumen</tipo>
      <valor>Resumen text</valor>
      <longitud>8000</longitud>
      <comentario></comentario>
      <enlace></enlace>
      <target_enlace></target_enlace>
    </dato>
    <dato>
      <etiqueta>Imagen</etiqueta>
      <tipo>TextBox</tipo>
      <valor>http://url/Imagenes/7D2BE6480CF4486CA288A75932606181.jpg</valor>
      <longitud>1500</longitud>
      <comentario></comentario>
      <enlace></enlace>
      <target_enlace>I</target_enlace>
    </dato>
  </PARRAFO>
  <PARRAFO orden='1' tipo='parrafo'>
    <dato>
      <etiqueta>Título</etiqueta>
      <tipo>TextBox</tipo>
      <valor>TextBox text</valor>
      <longitud>1500</longitud>
      <comentario></comentario>
      <enlace></enlace>
      <target_enlace>I</target_enlace>
    </dato>
    <dato>
      <etiqueta>Texto</etiqueta>
      <tipo>Resumen</tipo>
      <valor>Resumen text</valor>
      <longitud>8000</longitud>
      <comentario></comentario>
      <enlace></enlace>
      <target_enlace></target_enlace>
    </dato>
  </PARRAFO>
</docXML>

..我将使用以下XSLT将模板应用于每个部分,具体取决于“PARRAFO”中每个节点“dato”的标签“etiqueta”的值:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xsl" exclude-result-prefixes="msxsl">

  <xsl:output method="html" encoding="iso-8859-1"/>

<xsl:template match="/">
    <xsl:variable name="xml-doc-parrafo" select="documentoXML/PARRAFO"/>
   <!-- PARRAFOS -->
    <xsl:choose>
      <xsl:when test="count($xml-doc-parrafo)>0">
        <div class="seccion_1">
          <xsl:for-each select="$xml-doc-parrafo">
            <xsl:choose>
              <xsl:when test="self::node()[@tipo = 'parrafo']">
                <div class="parrafo">
                  <xsl:for-each select="self::node()[@tipo = 'parrafo']/dato">
                    <xsl:variable name="dato" select="self::node()[@tipo = 'parrafo']/dato"/>
                    <xsl:variable name="nextdato" select="following::dato[1]/@etiqueta"/>

                    <xsl:choose>
                      <xsl:when test="etiqueta = 'Título'">
                        <xsl:call-template name="imprimeTituloParrafo">
                          <xsl:with-param name="etiqueta" select="etiqueta"></xsl:with-param>
                          <xsl:with-param name="valor" select="valor"></xsl:with-param>
                          <xsl:with-param name="longitud" select="longitud"></xsl:with-param>
                          <xsl:with-param name="comentario" select="comentario"></xsl:with-param>
                          <xsl:with-param name="enlace" select="enlace"></xsl:with-param>
                          <xsl:with-param name="target_enlace" select="target_enlace"></xsl:with-param>
                        </xsl:call-template>
                      </xsl:when>
                      <xsl:when test="etiqueta = 'Subtitulo'">
                        <xsl:call-template name="imprimeSubtituloParrafo">
                          <xsl:with-param name="etiqueta" select="etiqueta"></xsl:with-param>
                          <xsl:with-param name="valor" select="valor"></xsl:with-param>
                          <xsl:with-param name="longitud" select="longitud"></xsl:with-param>
                          <xsl:with-param name="comentario" select="comentario"></xsl:with-param>
                          <xsl:with-param name="enlace" select="enlace"></xsl:with-param>
                          <xsl:with-param name="target_enlace" select="target_enlace"></xsl:with-param>
                        </xsl:call-template>
                      </xsl:when>

                      <xsl:when test="etiqueta = 'Imagen'">
                        <xsl:call-template name="imprimeImagenParrafo">
                          <xsl:with-param name="etiqueta" select="etiqueta"></xsl:with-param>
                          <xsl:with-param name="valor" select="valor"></xsl:with-param>
                          <xsl:with-param name="longitud" select="longitud"></xsl:with-param>
                          <xsl:with-param name="comentario" select="comentario"></xsl:with-param>
                          <xsl:with-param name="enlace" select="enlace"></xsl:with-param>
                          <xsl:with-param name="target_enlace" select="target_enlace"></xsl:with-param>
                        </xsl:call-template>
                      </xsl:when>

                      <xsl:when test="etiqueta = 'Pie Imagen'">
                        <xsl:call-template name="imprimePieImagenParrafo">
                          <xsl:with-param name="etiqueta" select="etiqueta"></xsl:with-param>
                          <xsl:with-param name="valor" select="valor"></xsl:with-param>
                          <xsl:with-param name="longitud" select="longitud"></xsl:with-param>
                          <xsl:with-param name="comentario" select="comentario"></xsl:with-param>
                          <xsl:with-param name="enlace" select="enlace"></xsl:with-param>
                          <xsl:with-param name="target_enlace" select="target_enlace"></xsl:with-param>
                        </xsl:call-template>
                      </xsl:when>

                      <xsl:when test="etiqueta = 'Texto'">
                        <xsl:call-template name="imprimeTextoParrafo">
                          <xsl:with-param name="etiqueta" select="etiqueta"></xsl:with-param>
                          <xsl:with-param name="valor" select="valor"></xsl:with-param>
                          <xsl:with-param name="longitud" select="longitud"></xsl:with-param>
                          <xsl:with-param name="comentario" select="comentario"></xsl:with-param>
                          <xsl:with-param name="enlace" select="enlace"></xsl:with-param>
                          <xsl:with-param name="target_enlace" select="target_enlace"></xsl:with-param>
                        </xsl:call-template>
                      </xsl:when>

                    <xsl:when test="etiqueta = 'Pie Parrafo'">
                      <xsl:call-template name="imprimePieParrafo">
                        <xsl:with-param name="etiqueta" select="etiqueta"></xsl:with-param>
                        <xsl:with-param name="valor" select="valor"></xsl:with-param>
                        <xsl:with-param name="longitud" select="longitud"></xsl:with-param>
                        <xsl:with-param name="comentario" select="comentario"></xsl:with-param>
                        <xsl:with-param name="enlace" select="enlace"></xsl:with-param>
                        <xsl:with-param name="target_enlace" select="target_enlace"></xsl:with-param>
                      </xsl:call-template>
                    </xsl:when>

                    </xsl:choose>
                  </xsl:for-each>
                </div>
              </xsl:when>
            </xsl:choose>
          </xsl:for-each>
        </div>
      </xsl:when>
      <!-- si no hay resultados -->
      <xsl:otherwise>
        <br></br>
        <p style="text-align:center;">El documento no contiene datos.</p>
      </xsl:otherwise>
    </xsl:choose>
 </xsl:template>

  <xsl:template name="imprimeTituloParrafo">
    <xsl:param name="etiqueta"></xsl:param>
    <xsl:param name="valor"></xsl:param>
    <xsl:param name="longitud"></xsl:param>
    <xsl:param name="enlace"></xsl:param>
    <xsl:param name="target_enlace"></xsl:param>

    <h2 class="titulo">
      <xsl:choose>
          <xsl:when test="string-length($enlace) > 0">
            <xsl:call-template name="imprimeEnlace">
              <xsl:with-param name="valor" select="valor"></xsl:with-param>
              <xsl:with-param name="longitud" select="longitud"></xsl:with-param>
              <xsl:with-param name="comentario" select="comentario"></xsl:with-param>
              <xsl:with-param name="enlace" select="enlace"></xsl:with-param>
              <xsl:with-param name="target_enlace" select="target_enlace"></xsl:with-param>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="$valor"/>
        </xsl:otherwise>
      </xsl:choose>
    </h2>
  </xsl:template>

  <xsl:template name="imprimeSubtituloParrafo">
    <xsl:param name="etiqueta"></xsl:param>
    <xsl:param name="valor"></xsl:param>
    <xsl:param name="longitud"></xsl:param>
    <xsl:param name="enlace"></xsl:param>
    <xsl:param name="target_enlace"></xsl:param>

    <h3 class="subtitulo">
      <xsl:choose>
        <xsl:when test="string-length($enlace) > 0">
          <xsl:call-template name="imprimeEnlace">
            <xsl:with-param name="valor" select="valor"></xsl:with-param>
            <xsl:with-param name="longitud" select="longitud"></xsl:with-param>
            <xsl:with-param name="comentario" select="comentario"></xsl:with-param>
            <xsl:with-param name="enlace" select="enlace"></xsl:with-param>
            <xsl:with-param name="target_enlace" select="target_enlace"></xsl:with-param>
          </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="$valor"/>
        </xsl:otherwise>
      </xsl:choose>
    </h3>
  </xsl:template>

  <xsl:template name="imprimeTextoParrafo">
    <xsl:param name="etiqueta"></xsl:param>
    <xsl:param name="valor"></xsl:param>
    <xsl:param name="longitud"></xsl:param>
    <xsl:param name="enlace"></xsl:param>
    <xsl:param name="target_enlace"></xsl:param>

    <div class="texto">
      <p class="texto">
        <xsl:copy-of select="$valor/node()"/>
      </p>
    </div>
  </xsl:template>

  <xsl:template name="imprimeImagenParrafo">
    <xsl:param name="etiqueta"></xsl:param>
    <xsl:param name="valor"></xsl:param>
    <xsl:param name="longitud"></xsl:param>
    <xsl:param name="comentario"></xsl:param>
    <xsl:param name="enlace"></xsl:param>
    <xsl:param name="target_enlace"></xsl:param>

    <xsl:choose>
      <xsl:when test="string-length($enlace) = 0">
        <xsl:call-template name="imprimeImagen">
          <xsl:with-param name="etiqueta" select="etiqueta"></xsl:with-param>
          <xsl:with-param name="valor" select="valor"></xsl:with-param>
          <xsl:with-param name="longitud" select="longitud"></xsl:with-param>
          <xsl:with-param name="comentario" select="comentario"></xsl:with-param>
          <xsl:with-param name="enlace" select="enlace"></xsl:with-param>
          <xsl:with-param name="target_enlace" select="target_enlace"></xsl:with-param>
        </xsl:call-template>        
      </xsl:when>
      <xsl:otherwise>
        <a>
          <xsl:choose>
            <xsl:when test="$target_enlace/node() = 'E'">
              <xsl:attribute name="target">
                <xsl:text>_blank</xsl:text>
              </xsl:attribute>
            </xsl:when>
            <xsl:when test="$target_enlace/node() = 'I'">
              <xsl:attribute name="target">
                <xsl:text>_self</xsl:text>
              </xsl:attribute>
            </xsl:when>
          </xsl:choose>
          <xsl:attribute name="href">
            <xsl:value-of select="$enlace"/>
          </xsl:attribute>

          <xsl:call-template name="imprimeImagen">
            <xsl:with-param name="etiqueta" select="etiqueta"></xsl:with-param>
            <xsl:with-param name="valor" select="valor"></xsl:with-param>
            <xsl:with-param name="longitud" select="longitud"></xsl:with-param>
            <xsl:with-param name="comentario" select="comentario"></xsl:with-param>
            <xsl:with-param name="enlace" select="enlace"></xsl:with-param>
            <xsl:with-param name="target_enlace" select="target_enlace"></xsl:with-param>
          </xsl:call-template>

        </a>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name="imprimeImagen">
    <xsl:param name="etiqueta"></xsl:param>
    <xsl:param name="valor"></xsl:param>
    <xsl:param name="longitud"></xsl:param>
    <xsl:param name="comentario"></xsl:param>
    <xsl:param name="enlace"></xsl:param>
    <xsl:param name="target_enlace"></xsl:param>
    <div class="imagen_pie">
      <img>
        <xsl:attribute name="src">
          <xsl:value-of select="$valor"/>
        </xsl:attribute>
        <xsl:attribute name="alt">
          <xsl:value-of select="$comentario"/>
        </xsl:attribute>
      </img>
    </div>
  </xsl:template>


  <xsl:template name="imprimeEnlace">
    <xsl:param name="valor"></xsl:param>
    <xsl:param name="longitud"></xsl:param>
    <xsl:param name="comentario"></xsl:param>
    <xsl:param name="enlace"></xsl:param>
    <xsl:param name="target_enlace"></xsl:param>
    <a>
      <xsl:choose>
        <xsl:when test="$target_enlace/node() = 'E'">
          <xsl:attribute name="target">
            <xsl:text>_blank</xsl:text>
          </xsl:attribute>
        </xsl:when>
        <xsl:when test="$target_enlace/node() = 'I'">
        </xsl:when>
        <xsl:when test="$target_enlace/node() = 'D'">
        </xsl:when>
      </xsl:choose>
      <xsl:attribute name="href">
        <xsl:value-of select="enlace"/>
      </xsl:attribute>
      <xsl:value-of select="$valor"/>
    </a>
  </xsl:template>

 .... 

</xsl:stylesheet>

我需要先在文本“Texto”之前应用模板图像(如果存在于此“PARRAFO”中)“Imagen”

现在首先应用模板文本,然后应用图像,因为它位于图像之前的文本节点之前,如xml所示

非常感谢!

最佳答案 当XML最好以“声明式”风格编写时,您试图以“程序”风格编写XML.这些被称为“拉”和“推”处理.以下是使用您的数据可能有所帮助的示例:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" version="1.0">
  <xsl:output method="html" encoding="iso-8859-1"/>

  <xsl:template match="/">
    <rootNode>
      <xsl:apply-templates select="docXML/PARRAFO[@tipo='parrafo']"/>
    </rootNode>
  </xsl:template>

  <xsl:template match="PARRAFO[@tipo='parrafo']">
    <div class="parrafo">
    <xsl:apply-templates select="dato[etiqueta='Imagen']"/>
    <xsl:apply-templates select="dato[etiqueta='Texto']"/>
    </div>
  </xsl:template>

  <xsl:template match="dato[etiqueta='Imagen']">
    <image></image>
    <!-- processing -->
  </xsl:template>

  <xsl:template match="dato[etiqueta='Texto']">
    <text></text>
    <!-- processing -->
  </xsl:template>

</xsl:stylesheet>
点赞