2

以下のXSLテンプレートとXMLを前提として、これが私が達成しようとしているHTML出力です(多かれ少なかれ):

<p>
foo goes here
  <span class="content"><p>blah blah blah</p><p>blah blah blah</p></span>
bar goes here
  <span class="content">blah blah blah blah blah blah</span> 
</p>

実際にレンダリングされるものは次のとおりです(<span.content>のコンテンツ全体が欠落しています)。

<p>
foo goes here
  <span class="content"></span>
bar goes here
  <span class="content">blah blah blah blah blah blah</span> 
</p>

これが私のテンプレート(スニペット)です:

 <xsl:template match="note[@type='editorial']">
   <span class="content">
     <xsl:apply-templates />
   </span>
 </xsl>
 <xsl:template match="p">
   <p>
     <xsl:apply-templates />
   </p>
 </xsl>

これが私のxmlです:

<p>
foo goes here
  <note type="editorial"><p>blah blah blah</p><p>blah blah blah</p></note>
bar goes here
  <note type="editorial">blah blah blah blah blah blah</note> 
</p>

特定の要素をレンダリングすることは重要ではありません。すなわち。テキスト要素が失われない限り、<p>、<div>、または<span>がレンダリングされるかどうかは関係ありません。<note>要素に任意の子を含めることができると仮定して、「p / note/p」に一致する特定のルールを作成することは避けたいと思います。

私はxslに完全に精通しているので、追加のヒントやポインタは本当に役に立ちます。

前もって感謝します。

4

3 に答える 3

1

apply-templatesの代わりに使用する必要がありますapply-template

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="note[@type='editorial']">
        <span class="content">
            <xsl:apply-templates/>
        </span>
    </xsl:template>
    <xsl:template match="p">
        <p>
            <xsl:apply-templates />
        </p>
    </xsl:template>
 </xsl:stylesheet>
于 2012-11-29T23:35:26.043 に答える
1

OK、それで私はただ騒ぎ回っています、そしてこれが私が最終的に思いついた解決策です。

ネストされた<p>タグは機能しません。あなたのブラウザはそれらを好きではなく、XSLTもそれらを好きではありません。そこで、すべてを<divs>と<spans>に切り替えました

また、テンプレートの最後にキャッチオールテンプレートをいくつか追加しました。

これが私の目的のために十分に機能している最終バージョンです:

<xsl:template match="note[@type='editorial']">
   <span class="content">
     <xsl:apply-templates />
   </span>
</xsl:template>

<xsl:template match="p">
  <div class="para">
    <xsl:apply-templates />
  </div>
</xsl:template>

<xsl:template match="*">
  <xsl:apply-templates />
</xsl:template>

<xsl:template match="text()">
  <xsl:value-of select="." />
</xsl:template>

h / t:

http://www.dpawson.co.uk/xsl/sect2/defaultrule.html

xsl:apply-templatesは、私が定義したテンプレートのみとどのように一致しますか?

于 2012-11-29T23:54:21.913 に答える
0
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
    <xsl:apply-templates select="p"/>
    </xsl:template>
    <xsl:template match="p">
    <p>
    <xsl:apply-templates/>
    </p>
    </xsl:template>
    <xsl:template match="span">
     <note type="editorial">
     <xsl:choose>
     <xsl:when test="child::*">
     <xsl:copy-of select="child::*"/>
     </xsl:when>
     <xsl:otherwise>
                <xsl:value-of select="."/>
    </xsl:otherwise>
    </xsl:choose>
    </note>
    </xsl:template>
    <xsl:template match="text()">
    <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>
于 2012-11-30T10:33:59.530 に答える