我是新手,所以请耐心等待……
如果我们有以下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>