0

わかりましたので、解決できないように見える xslt の問題があります。これは質問をする 2 回目の試みです。重複としてマークしないでください。

<p>私の問題は、ドキュメントの 4 番目のタグの後に HTML を含めたいということです。<p>問題は、属性を持つタグが存在する可能性があることですclass="exclude"

タグにそのクラスがある場合、<p>その段落をレンダリングしたくありません。同時に、含まれている html を 4 番目の段落の後にレンダリングしたいと思います<p class="excludes"

編集::これは私が以前持っていたxslです。これにより、含まれている html が 4 番目の段落に挿入されます。

<xsl:template match="content/p[position() = 4]">
     content include<xsl:apply-templates /></p>
</xsl:template> 

ここにいくつかの入力/出力の例があります

<p class="excludes">まず、私の入力がない基本的な例は次のとおりです。

<body>
<p></p>
<p></p>
<p></p>
<p></p>
include new HTML here
<p></p>
...
</body>

その例では、html は xslt を通過した後、4 番目の段落の後にうまくレンダリングされます。

ただし、考慮する必要があります<p class="exclude">

これは、より複雑な例です<p class="exclude" being used >

<body>
<p class="exclude"></p> (should not be rendering on page)
<p></p>
<p></p>
<p></p>
<p></p>
include new HTML here
<p></p>
...
</body>

この例では、最初の段落がページにレンダリングされるべきではないため、含まれている HTML が 5 番目の * 段落の後に表示されていることに注意してください。より複雑な例をもう 1 つ見てみましょう。

<body>
<p class="exclude"></p> (this should not be rendering on page)
<p></p>
<p class="exclude"></p> (this should not be rendering on page)
<p class="exclude"></p> ...
<p></p>
<p class="exclude"></p> ...
<p></p>
<p class="exclude"></p> ...
<p class="exclude"></p> ...
<p class="exclude"></p> ...
<p></p>
new HTML include here
<p></p>
...
<body>
<p class="exclude"></p>

さて、私の最後の例では、複数が追加されていることがわかります。<p class="excludes"はい、レンダリングされた 4 番目の段落の後に新しい html コンテンツをレンダリングする必要があります。この例では、すべての段落の合計 11 番目です。

これを達成するのに役立つxsltを誰かが持っていれば、それは素晴らしいことです。xslt 1.0 を使用していることを覚えておいてください。よろしくお願いします。

4

2 に答える 2

1

別の XSLT 1.0 スタイルシート オプションを次に示します。

pこれでは、コメントで言及された要素の「通常の処理」を考慮に入れようとしました。

この例では、 a が処理されたことを示すためだけに処理命令を追加していpます。これは、XSLT で行っている内容に応じて、置き換えたり削除したりできます。

XML 入力

<body>
    <p class="exclude">delete1</p>
    <p>keep1</p>
    <p class="exclude">delete2</p>
    <p class="exclude">delete3</p>
    <p>keep2</p>
    <p class="exclude">delete4</p>
    <p>keep3</p>
    <p class="exclude">delete5</p>
    <p class="exclude">delete6</p>
    <p class="exclude">delete7</p>
    <p>keep4</p>
    <p>keep5</p>
    <p class="exclude">delete8</p>
</body>

XSLT 1.0 (Xalan および Saxon 6.5.5 でテスト済み)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <!--Strip p if class attribute value is exclude.-->
    <xsl:template match="p[@class='exclude']"/>

    <!--Special handling of the 4th non-exclude p. Call the "normal" template to 
        handle any other p processing and then output the additional HTML.-->
    <xsl:template match="p[not(@class='exclude')][count(preceding::p[not(@class='exclude')])+1=4]">
        <xsl:call-template name="normal"/>      
        <b>ADDITIONAL HTML HERE</b>
    </xsl:template>

    <!--This is the "normal" processing of "p". For the example, just adding a PI.-->
    <xsl:template match="p" name="normal">
        <xsl:copy>
            <xsl:processing-instruction name="processed">normally</xsl:processing-instruction>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>     
    </xsl:template>

</xsl:stylesheet>

出力

<body>
   <p><?processed normally?>keep1</p>
   <p><?processed normally?>keep2</p>
   <p><?processed normally?>keep3</p>
   <p><?processed normally?>keep4</p>
   <b>ADDITIONAL HTML HERE</b>
   <p><?processed normally?>keep5</p>
</body>
于 2012-06-15T04:11:57.273 に答える
0

処理しているpごとに、確認してください...

<xsl:if test="count(preceding::p[not(@class='exclude')])=4">
   render your html here
</xsl:if>

編集

さらに、あなたのさらなる質問と関係があります:

<xsl:apply-tempates select="p[not(@class='exlude')]"/>

<xsl:template match="p">
   <p>
     <xsl:if test="count(preceding::p[not(@class='exclude')])=4">
      render your html here
   </xsl:if>
   </p>
</xsl:template>

他のすべてのpが必要ない場合は、カウントを一致させることができます。

編集

私はあなたの更新された質問を見ました、そしてあなたが不均衡なテンプレートを持っているので、それがどのように機能するかわかりません(あなたは閉じたpを持っていますが、開いたものはありませんか?)-これはタイプミスだと思います。また、あなたはあなたのpが体の中にあると言いますが、あなたはcontent/pで一致しています。コンテンツタグはどこから来たのですか。

とにかく、元のテンプレートが次のようになっていると仮定して、修正を加えます。

<xsl:template match="content/p[position() = 4]">
    <p>content include<xsl:apply-templates /></p> 
</xsl:template> 

それはうまくいきました、ただそれをに変更してください

に変更するだけです

<xsl:template match="p[count(preceding::p[not(@class='exclude')])=4]">
    <p>content include<xsl:apply-templates /></p> 
</xsl:template> 

それはあなたに正しいことを与えるでしょう

于 2012-06-14T15:29:46.000 に答える