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