XSLT / XPath: bir önceki yorum seçilmesi

2 Cevap php

Ben biçimlendirmek istiyorum aşağıdaki biçimde XML vardır:

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

Benim sorunum her blok etiketi yukarıda yorumları seçmek için nasıl anlamaya olamaz. Aşağıdaki XSL'yi vardır:

<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>

Ben çalışıyorum çıktı:

=== apples ===
block1
=== bananas ===
block2
=== oranges ===
block3

Ama olsun en iyisi:

=== apples ===
=== bananas ===
=== oranges ===
block1
=== apples ===
=== bananas ===
=== oranges ===
block2
=== apples ===
=== bananas ===
=== oranges ===
block3

Herhangi bir fark yaparsa ben PHP kullanıyorum.

2 Cevap

Sırayla olur böylece, yerine ikinci birinin ilk uygulamak şablonları da yorum için şablonlar uygulayabilirsiniz - Ayrıca, bu çözüm kaynak xml veri sırasına bağlıdır ..

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

PS: - Bunu optimal olmayan olabilir gibi ifadelerde "/ /" kullanarak önlemek olabilir.

[EDIT] Complete Stylesheet

<?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>

Eğer blok ve yorumun hem de değerini yazdırmak sonra, satırsonlarını isterseniz aşağıdaki deyimi ekleyin.

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

Sizin stil biraz aşırı karmaşıktır.

Aşağıdaki stil denemelisiniz ve bunu istediğiniz çıktıyı maçlar olduğunu göreceksiniz!

<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>

Bu kod her zaman doğru güncel blok etiketinden önce başlar 1 veya 0 yorum eşleşir.