2011-01-05 83 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> 

我想創建一個只會影響一個xml的特殊模板。
我在asp.net 2.0 C#XslCompiledTransform處理器上工作。

回答

1

不,你不能這樣做。 (編輯:在XSLT 1.0至少,見@Alejandro's answer一種方式來做到這一點在XSLT 2.0。)

的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> 
+0

你寫*的XML節點沒有它有文件的概念已被存儲*但它具有URI的概念,所以它知道它的文檔URI(只能在XPath/XSLT 2.0中訪問)。另外,請記住XSLT 1.0中的模式不能包含變量/參數引用。 – 2011-01-05 14:35:31

+0

@Alejandro:ASP.NET 2.0 C#'XslCompiledTransform'不能做XSLT 2.0。但有趣的是,您可以在那裏檢索文檔URI,但我不知道(如果文檔只是內存中的對象,那麼URI是什麼?)。你對模式正確,我已經刪除了錯誤的例子。 – Tomalak 2011-01-05 14:39:31

+0

@both謝謝你 – 2011-01-05 14:42:46

1

在XSLT/XPath 2.0中,您可以:

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

resolve-uri()工作的目錄是什麼?當前的環境目錄,我猜? – Tomalak 2011-01-05 14:46:06

+0

@Tomalak:好點。我用'resolve-uri'來表示''plop.xml''不是一個完整的URI。我認爲可以在這種情況下使用p/2格式。 – 2011-01-05 14:49:38