Pregunta

Tengo XML con el siguiente formato que quiero cambiar el formato:

<blocks>
    <!-- === apples === -->
    <block name="block1">
        ...
    </block>
    <!-- === bananas === -->
    <block name="block2">
        ...
    </block>
    <!-- === oranges === -->
    <block name="block3">
        ...
    </block>
</blocks>

Mi problema es que no puedo encontrar la manera de seleccionar los comentarios sobre cada etiqueta de bloque. Tengo el siguiente XSL:

<xsl:template match="//blocks">
        <xsl:apply-templates select="block" />
</xsl:template>
<xsl:template match="block">
    <xsl:apply-templates select="../comment()[following-sibling::block[@name = ./@name]]" />
    <xsl:value-of select="./@name" />
</xsl:template>
<xsl:template match="comment()[following-sibling::block]">
    <xsl:value-of select="."></xsl:value-of>
</xsl:template>

La salida que estoy tratando de es:

=== === manzanas
Bloque 1
=== === plátanos
Bloque 2
=== === naranjas
Bloque 3

Pero lo mejor que puedo conseguir es:

=== === manzanas
=== === plátanos
=== === naranjas
Bloque 1
=== === manzanas
=== === plátanos
=== === naranjas
Bloque 2
=== === manzanas
=== === plátanos
=== === naranjas
Bloque 3

Estoy usando PHP si hay alguna diferencia.

¿Fue útil?

Solución

Puede aplicar las plantillas para los comentarios también en sus primeros apply-templates en lugar de la segunda, para que pase el fin - Además, esta solución depende del orden de los datos en el xml fuente ..

<xsl:template match="//blocks">
        <xsl:apply-templates select="block | comment()" />
</xsl:template>

PS: -. Usted podría evitar el uso de "//" en sus expresiones, ya que puede no ser óptima

[EDIT] Completo de estilo

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="//blocks">
  <xsl:apply-templates select="block | comment()"/>
 </xsl:template>
 <xsl:template match="block">
  <xsl:value-of select="./@name"/>
 </xsl:template>
 <xsl:template match="comment()">
  <xsl:value-of select="."/>
 </xsl:template>
</xsl:stylesheet>

Agregue la siguiente instrucción si quieres saltos de línea, después de imprimir el valor tanto en el bloque y el comentario.

<xsl:text>&#10;</xsl:text>

Otros consejos

Su hoja de estilo es un poco demasiado complicado.

Usted debe tratar de la hoja de estilo a continuación y se encuentra que coincide con la salida que desea!

<xsl:template match="//blocks">
        <xsl:apply-templates select="block" />
</xsl:template>
<xsl:template match="block">
    <xsl:apply-templates select="preceding-sibling::comment()[1]" />
    <xsl:value-of select="./@name" />
</xsl:template>
<xsl:template match="comment()">
    <xsl:value-of select="."></xsl:value-of>
</xsl:template>

Este código siempre coincide con 1 o 0 comentarios que comienzan justo antes de la etiqueta de bloque actual.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top