2012-02-15 14 views
2

外部ブロックのXSLコードをロードすることは可能ですか?たとえばaspx includeなどのコードブロックをロードする方法と似ていますか? EG:XSLコードの外部ブロックをロードする

<xsl:if test="$ShowNextButton='No'"> 
     <!-- A Block of external code would be loaded here --> 
    </xsl:if> 

それが違いを作る場合、私はXSLT 1.0を使用しています。

+0

xsltパーサーは何を使用していますか?存在する場合、それは特定のパーサー機能になります。 xsltを処理するXSLTを使って、xsltがマージするべきことを伝えるノードを保持する何かを作り出すことができます...トリッキーな... – rene

+0

申し訳ありません。私が従うかどうかわからない? xsltパーサーはどういう意味ですか?申し訳ありませんが、私はちょっとしたフロントエンドの開発者です。 –

+1

@ user1001421:XSLTの 'xsl:import'と' xsl:include'命令を知っておく必要があります。ただし、無条件です。現時点では、XSLT 1.0では動的条件付きの包含は許可されていません。 XSLT 2.0では、 'use-when'属性を使用することで、コンパイル時の条件付きコンパイルを非常に制限することができます。 –

答えて

7

"外部XSLコード"のブロックを名前付きテンプレートに入れることができれば、簡単にこれを行うことができます。

ここには、メインのXSLTスタイルシート(base.xsl)を使用し、外部のXSLTスタイルシート(include.xsl)を含む一般的な例があります。

input.xmlに

<test> 
    <foo trigger-template="yes"> 
    <bar>Original "bar".</bar> 
    </foo> 
    <foo trigger-template="no"> 
    <bar>Original "bar".</bar> 
    </foo> 
</test> 

base.xsl

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

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

    <xsl:template match="foo"> 
    <foo> 
     <xsl:if test="@trigger-template='yes'"> 
     <xsl:call-template name="external-template"> 
      <xsl:with-param name="statement" select="'Successfully called external XSL code!'"/> 
     </xsl:call-template> 
     </xsl:if> 
     <xsl:apply-templates/> 
    </foo> 
    </xsl:template> 

</xsl:stylesheet> 

include.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template name="external-template"> 
    <xsl:param name="statement"/> 
    <bar><xsl:value-of select="$statement"/></bar> 
    </xsl:template> 

</xsl:stylesheet> 

output.xml

+0

は、広範な答えに感謝しています! – brutusmaximus86

関連する問題