没有返回元素名称(XSL / XPath)

时间:2010-08-03 19:29:01

标签: xslt xpath

我有代码,我希望返回元素名称,但不返回任何内容。

以下代码来自生成另一个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}">返回的结果中的元素名称。

谢谢! :)

2 个答案:

答案 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()}">