2011-01-05 17 views
0

ノードの値を表示するためにそのようなことを行うことはできますか?テンプレートの一致と文書

<!-- plop.xml : --> 
<?xml version="1.0"?> 
<root> 
     <node1>hello</node1> 
</root> 

<xsl:template name="my_template" match="document('plop.xml')/root" > 
     <xsl:value-of select="node1"/> 
</xsl:template> 

<xsl:call-template name="my_template"></xsl:call-template> 

1つのXMLにのみ影響する特別なテンプレートを作成したいと思います。
私はasp .net 2.0 C#XslCompiledTransformプロセッサで動作します。

答えて

1

いいえ、そんなことはできません。 (EDIT:XSLT 1.0において、少なくとも、XSLT 2.0でそれを行うための方法を@Alejandro's answerを参照。)

XMLは必ずしも対応しないので、XMLノードは、それに格納されたファイルの概念がありません最初の場所に実際のファイル。したがって、特定のファイル内のノードにのみ一致するテンプレートを記述することはできません。

あなたは

<xsl:param name="fileName" select="''" /> 

は、お好みの値を使用してC#のプログラムからそれを記入し、その後、XSLTプログラムは、そのパラメータの値に基づいて異なる動作を行い、パラメータを宣言することができます。

<xsl:template match="root"> 
    <xsl:choose> 
    <xsl:when test="$fileName = 'plop.xml'"> 
     <!-- do something --> 
    </xsl:when> 
    <xsl:otherwise> 
     <!-- do something else --> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
XSLTで
+0

格納されている*しかし、それはURIの概念を持っているので、その文書のURI(XPath/XSLT 2.0でのみアクセス可能)を知っている。また、XSLT 1.0のパターンには変数/パラメータの参照を含めることはできません。 –

+0

@Alejandro:ASP.NET 2.0 C# 'XslCompiledTransform'はXSLT 2.0を実行できません。しかし、面白いことに、そこに文書URIを取得することができます、私はそれを知らなかった(BTW:文書がメモリ内オブジェクトだけの場合、URIはどうなりますか?)あなたはパターンが正しいです、私は間違った例を削除しました。 – Tomalak

+0

@ bothありがとう –

1

/XPath 2.0のことができます:あなたはXMLノードは、それが持っていたファイルの概念がありません*書いた

<xsl:template match="/root[document-uri(.) eq resolve-uri('plop.xml',.)]"> 
     <xsl:value-of select="node1"/> 
</xsl:template> 
+0

'resolve-uri()'はどのディレクトリに対応していますか?環境の現在のディレクトリ、私は思いますか? – Tomalak

+0

@Tomalak:良い点。 '' plop.xml ''が完全なURIでないことを示すために '' resolve-uri''を使用しました。私はこの場合にp/2形式を使うことができると思う。 –

関連する問題