1

先行 (または先行兄弟) および後続 (または後続兄弟) を正しく機能させることができません。

私は次のxmlを持っています:

<doc xmlns:lxslt="http://xml.apache.org/xslt" xml:lang="it">
    <articolo id="U50779749147XPB">
        <testatina id="U50779749147xtG">
            <ln>in breve</ln>
        </testatina>
        <breve id="U50779749147yAC">
            <h1>melegnano</h1>
            <h2>Si ribalta</h2>
            <h2>con l’auto</h2>
            <h2>alla rotonda</h2>
            <p>
                <span class="rettangolo">n</span>
                Sempre caro mi fu quest'ermo colle, e questa siepe, che da tanta
                parte dell'ultimo orizzonte il guardo esclude. Ma sedendo e mirando,
            </p>
            <p class="rimando">
                segue a pagina
                <span class="pagina">5</span>
            </p>
            <h1>castelnuovo</h1>
            <h2>Protesta</h2>
            <h2>delle mamme</h2>
            <h2>per la scuola</h2>
            <p>
                <span class="rettangolo">n</span>
                Sempre caro mi fu quest'ermo colle, e questa siepe, che da tanta
                parte dell'ultimo orizzonte il guardo esclude. Ma sedendo e mirando
        </p>
            <p class="rimando">
                segue a pagina
                <span class="pagina">8</span>
            </p>
            <h1>salerano</h1>
            <h2>sull’incendio: </h2>
            <h2>«non ci sono </h2>
            <h2>misteri»</h2>
            <p>
                <span class="rettangolo">n</span>
                Sete il guardo esclude. Ma sedendo e mirando, interminati spazi di
            </p>
            <p class="rimando">
                segue a pagina
                <span class="pagina">6</span>
            </p>
        </breve>
    </articolo>
</doc>

2 番目と 3 番目の h1 の間のすべてのノードとコンテンツを選択する必要があります。

            <h2>Protesta</h2>
            <h2>delle mamme</h2>
            <h2>per la scuola</h2>
            <p>
                <span class="rettangolo">n</span>
                Sempre caro mi fu quest'ermo colle, e questa siepe, che da tanta
                parte dell'ultimo orizzonte il guardo esclude. Ma sedendo e mirando
            </p>
            <p class="rimando">
                segue a pagina
                <span class="pagina">8</span>
            </p>

私はすべてを試しましたが、次と前は期待どおりに機能しません:私は試しました

 <xsl:variable name="set" select="/doc/articolo/breve/h1[2]/following::node()[count(.|/doc/articolo/breve/h1[3]/preceding::node())=count(/doc/articolo/breve/h1[3]/preceding::node())]"/>

しかし、結果は最初の h2: "Protesta" だけで、左側の h2 と p はすべてスキップされます。

そのため、演算子の次と前の単一の結果を確認しようとしましたが、ノードの前後のすべてではなく、いくつかの要素を返すだけです:たとえば:

 <xsl:variable name="vtextPostM" select="following-sibling::doc/articolo/breve/h1[2]"/>
             <xsl:variable name="vtextPreN" select="preceding-sibling::doc/articolo/breve/h1[3]"/>

returnin 要素なし、これ

<xsl:variable name="vtextPostM" select="/doc/articolo[1]/breve/h1[2]/following-sibling::node()"/>
             <xsl:variable name="vtextPreN" select="/doc/articolo[1]/breve/h1[3]/preceding-sibling::node()"/>

これは部分的に間違ったセットを返します: 以下は、Protesta (および他のすべての後続ノードではない) と先行する Melegnano (h1[1] ですが、中間のすべてのノードはどうですか) を出力します。私は他の多くのテストをしましたが、何もしませんでした。

4

1 に答える 1

2

これもXSLT2.0とで些細なこと<xsl:for-each-group>の1つですが、XSLT1.0を使用しているように見えるので、次の1つのオプションがあります。

スタイルシート

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:lxslt="http://xml.apache.org/xslt">
  <xsl:output method="xml" encoding="UTF-8" indent="yes"/>

  <xsl:template match="/">
    <xsl:apply-templates select="doc/articolo/breve"/>
  </xsl:template>

  <xsl:template match="breve">
    <xsl:copy>
      <xsl:apply-templates select="h1[2]"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="h1">
    <!--
    Apply following siblings whose first preceding <h1> sibling is the <h1>
    element currently being processed
    -->
    <xsl:apply-templates
      select="following-sibling::*[not(self::h1)][preceding-sibling::h1[1]
        [generate-id() = generate-id(current())]]"/>
  </xsl:template>
</xsl:stylesheet>

出力

<?xml version="1.0" encoding="UTF-8"?>
<breve>
  <h2>Protesta</h2>
  <h2>delle mamme</h2>
  <h2>per la scuola</h2>
  <p><span class="rettangolo">n</span>
                Sempre caro mi fu quest'ermo colle, e questa siepe, che da tanta
                parte dell'ultimo orizzonte il guardo esclude. Ma sedendo e mirando
        </p>
  <p class="rimando">
                segue a pagina
                <span class="pagina">8</span>
            </p>
</breve>
于 2013-03-01T11:51:47.970 に答える