2

再フォーマットしたい次のフォーマットの XML があります。

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

私の問題は、各ブロック タグの上にあるコメントを選択する方法がわからないことです。次の 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>

私がしようとしている出力は次のとおりです。

=== りんご ===
block1
=== バナナ ===
block2
=== オレンジ ===
block3

しかし、私が得ることができる最高のものは次のとおりです。

=== リンゴ ===
=== バナナ ===
===オレンジ === ブロック 1 === リンゴ === === バナナ === === オレンジ === ブロック 2 === リンゴ == = === バナナ === === オレンジ === block3








それが違いを生む場合、私はPHPを使用しています。

4

2 に答える 2

3

あなたのスタイルシートは少し複雑すぎます。

以下のスタイルシートを試してみると、希望する出力に一致することがわかります!

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

このコードは、現在のブロック タグの直前で始まる 1 個または 0 個のコメントに常に一致します。

于 2009-11-06T08:52:53.810 に答える
0

2 番目のテンプレートではなく、最初の apply-templates でコメントのテンプレートを適用することもできます。これにより、順番に適用されます。また、このソリューションは、ソース xml のデータの順序に依存します。

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

PS:- 最適ではない可能性があるため、式で「//」を使用することは避けてください。

[編集]完全なスタイルシート

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

ブロックとコメントの両方に値を出力した後、改行が必要な場合は次のステートメントを追加します。

<xsl:text>&#10;</xsl:text>
于 2009-11-06T08:46:55.400 に答える