Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在带有XSLT的XML文档中获取根元素的标记名?_Xml_Xslt_Xpath - Fatal编程技术网

如何在带有XSLT的XML文档中获取根元素的标记名?

如何在带有XSLT的XML文档中获取根元素的标记名?,xml,xslt,xpath,Xml,Xslt,Xpath,我感兴趣的是将xml文档中根元素的标记名分配给xslt变量。例如,如果文档看起来像(减去DTD): 1. 我想将字符串'foo'分配给xslt变量。有什么方法可以引用它吗 谢谢,马特把它弄明白了。给定参数*的函数名()将返回foo。我认为您希望检索最外层XML元素的名称。这可以像下面的XSL示例中那样完成: <?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="htt

我感兴趣的是将xml文档中根元素的标记名分配给xslt变量。例如,如果文档看起来像(减去DTD):


1.
我想将字符串'foo'分配给xslt变量。有什么方法可以引用它吗


谢谢,马特把它弄明白了。给定参数*的函数名()将返回foo。

我认为您希望检索最外层XML元素的名称。这可以像下面的XSL示例中那样完成:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:variable name="outermostElementName" select="name(/*)" />

  <xsl:template match="/">
    <xsl:value-of select="$outermostElementName"/>
  </xsl:template>
</xsl:stylesheet>

请注意,XPath术语略有不同:

树的顶部是根节点 (1.0术语)或文档节点 (2.0). 这就是“/”所指的。 它不是元素,而是父元素 最外层元件(以及任何 评论和处理说明 在最外层之前或之后的 元素)。根节点没有名称

请参见您想要使用XPath函数的

获取top(而非root!)元素名称的一个XPath表达式是:

名称(/*)

函数的作用是:返回节点的完全限定名,因此对于元素
,将返回字符串“bar:foo”


如果只需要名称的本地部分(无前缀和“:”),则应使用XPath函数。

@annakata:name()和local-name()不同。OP显然需要name()。他没有说他希望名称去掉任何名称空间前缀。公平地说,我的意思是“这将做你想做的”而不是“只有这个…”而且OP中也没有说他想要名称空间。我不知道你的情况,但根据我的经验,我90%以上的时间都对当地的名字感兴趣。名称空间是人们讨厌XSLT的原因之一。另外,如果使用XPath 1处理器,
/*/name()
@DiegoQueiroz,
/*/name()
将引发错误,而name(/*)可以很好地与XPath 1.0处理器以及实现高于1.0版本的处理器配合使用。因此,本答案的100%读者将从中受益,而80%的读者可能会因为未能使用
/*/name()
这一点而感到沮丧,但有时您并不追求兼容性。我使用的处理器强制我指定要循环的基本XPath(例如/*),然后将剩余的XPath映射到字段。这样,我提出的解决方案很方便。但很高兴知道它与旧版本不兼容。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:variable name="outermostElementName" select="name(/*)" />

  <xsl:template match="/">
    <xsl:value-of select="$outermostElementName"/>
  </xsl:template>
</xsl:stylesheet>