0

このxsl:apply-templates指示:

<xsl:if test="$item/tcm:Content/em:Office/em:Address">
    <address>
        <xsl:apply-templates mode="renderhtml" select="$item/tcm:Content/em:Office/em:Address/node()" />
    </address>
</xsl:if>

生成:

<p>
    My Office Address
    <br />XXXX Road
    <br />XXXX District
    <br />XXXX, XXXX.
    <br />PO Box XXXX
</p>

ここで、生成されたhtmlを変数に格納し、後で別のテンプレートを呼び出して最初の<p>要素をに置き換え<p property="v:street-address">、最終的な結果が次のようになるようにします。

<p property="v:street-address">
    My Office Address
    <br />XXXX Road
    <br />XXXX District
    <br />XXXX, XXXX.
    <br />PO Box XXXX
</p>

提案してください!!

ありがとう

4

2 に答える 2

1

XSLT 1.0 では、node-set()関数をサポートするプロセッサを使用している場合にのみ、出力をキャプチャしてその出力にテンプレートを適用できます。あなたがそうであると仮定すると、次のようなことができます:

<xsl:if test="$item/tcm:Content/em:Office/em:Address">
    <address>
      <xsl:variable name="addressHtml">
        <xsl:apply-templates mode="renderhtml" 
                             select="$item/tcm:Content/em:Office/em:Address/node()" />
      </xsl:variable>
      <xsl:apply-templates select="msxsl:node-set($addressHtml)" 
                           mode="adjustAddressHtml" />
    </address>
</xsl:if>

...

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

  <xsl:template match="/" mode="adjustAddressHtml">
    <xsl:if test="p">
      <xsl:call-template name="Identity" />
    </xsl:if>
    <xsl:if test="not(p)">
      <xsl:call-template name="StartingP" />
    </xsl:if>
  </xsl:template>

  <xsl:template match="/p[1]" mode="adjustAddressHtml" name="StartingP">
    <p property="v:street-address">
      <xsl:apply-templates select="@* | node()" mode="adjustAddressHtml" />
    </p>
  </xsl:template>
于 2013-02-10T14:08:49.903 に答える
0

ソース XML 文書が提供されなければ、完全な答えを出すことは困難ですが、一般的には 2 パス変換の必要性を回避できます。

代わりに、XSLT コードは次のように単純なものにすることができます

どこか:

<xsl:apply-templates mode="renderhtml"
         select="$item/tcm:Content/em:Office/em:Address/>

それで:

 <xsl:template match="em:Address" mode="renderhtml">
  <address>
      <xsl:apply-templates mode="renderhtml" select="node()" />
  </address>
 </xsl:template>

 <xsl:template match="em:Address/node()" mode="renderhtml">
    <p>
     <xsl:if test="position() = 1">
      <xsl:attribute name="property">v:street-address</xsl:attribute>
     </xsl:if>
       <!-- The code that generates this:
        My Office Address
        <br />XXXX Road
        <br />XXXX District
        <br />XXXX, XXXX.
        <br />PO Box XXXX
         -->
    </p>
 </xsl:template>
于 2013-02-10T17:46:25.193 に答える