我有代码,我希望返回元素名称,但不返回任何内容。
以下代码来自生成另一个XSL doc的XSL doc ..其中$ expression是一个动态创建XPath表达式的变量。
<xsl:template match="/">
...
<xslt:template match="{$expression}">
<elem key="{name()}">
<xslt:copy-of select="@*"/>
<xslt:for-each select="@*">
<xslt:sort select="name()"/>
<attribute>|<xslt:value-of select="name()"/>|</attribute>
</xslt:for-each>
</elem>
</xslt:template>
...
</xsl:template>
然后该代码使用此代码生成第二个XSL doc ..请注意@key是如何为空。
<xsl:template match="//*[@name='Spot']">
<elem key="">
<xsl:copy-of select="@*" />
<xsl:for-each select="@*">
<xsl:sort select="name()" />
<attribute>|<xsl:value-of select="name()" />|</attribute>
</xsl:for-each>
</elem>
</xsl:template>
除了@key为空,一切都按预期工作。我唯一的问题是显示元素的名称。
编辑:为了澄清我实际需要的内容,我需要<xslt:template match="{$expression}">
返回的结果中的元素名称。
谢谢! :)
答案 0 :(得分:1)
因为您的转换正在生成自己的XSLT代码,并且您希望得到结果:
<elem key="{name()}">
您必须转义{
和}
,以便不立即评估AVT。
按照 XSLT spec 中指定的方式加倍生成{
和}
>
“当属性值模板是 实例化,双左或右 表达式之外的大括号会 被一个花括号替换。 “
因此,请替换:
<xslt:template match="{$expression}">
<elem key="{name()}">
<xslt:copy-of select="@*"/>
<xslt:for-each select="@*">
<xslt:sort select="name()"/>
<attribute>|<xslt:value-of select="name()"/>|</attribute>
</xslt:for-each>
</elem>
</xslt:template>
使用:
<xslt:template match="{$expression}">
<elem key="{{name()}}">
<xslt:copy-of select="@*"/>
<xslt:for-each select="@*">
<xslt:sort select="name()"/>
<attribute>|<xslt:value-of select="name()"/>|</attribute>
</xslt:for-each>
</elem>
</xslt:template>
结果你会得到:
<xsl:template match="//*[@name='Spot']">
<elem key="{name()}">
<xsl:copy-of select="@*" />
<xsl:for-each select="@*">
<xsl:sort select="name()" />
<attribute>|<xsl:value-of select="name()" />|</attribute>
</xsl:for-each>
</elem>
</xsl:template>
注意:我很惊讶这段代码可以运行。您应该使用<xsl:namespace-alias>
XSLT指令。
答案 1 :(得分:0)
/
返回包含XML文档根节点的节点,而不是根节点本身。此节点没有名称。
我想要那个节点的孩子的名字。你可以通过多种方式实现这一目标。一个是您可以将<xsl:template match="/">
更改为<xsl:template match="/root">
(其中root
是根节点的名称),或者您可以将<elem key="{name()}">
更改为<elem key="{name(root)}">
。
但你可能事先不知道这个名字。如果是这种情况,您可以使用<xsl:template match="/*">
。这将返回root的父级的所有子级。在这种情况下,始终只有一个根。然后你可以正常使用<elem key="{name()}">
。