You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XSLT中通过select与内容赋值变量获取节点名的差异求助

问题:通过变量内容赋值无法获取节点名称

我在基于Altova引擎、采用XSLT 2.0的可变数据发布专有软件平台上遇到问题:使用select属性为变量赋值时,可正常获取节点名称;但通过变量内容(结合<xsl:copy-of>)赋值时,无法获取节点名。由于需要实现条件逻辑,必须让后者生效,恳请解决。

相关代码如下:

命名模板代码

<xsl:template name="setValidatedEmail">
  <xsl:param name="docType"/>
  <xsl:variable name="break" select="'&#13;&#10;'"/>
  <xsl:variable name="contEm1" select="."/>
  <xsl:variable name="contEm2">
    <xsl:copy-of select="."/>
  </xsl:variable>
  <validatedEmail>
    <xsl:result-document ...">
      <xsl:value-of select="local-name-from-QName(node-name($contEm1))"/>
      <xsl:value-of select="$break"/>
      <xsl:value-of select="local-name-from-QName(node-name($contEm2))"/>
    </xsl:result-document>
  </validatedEmail>
</xsl:template>

模板调用代码

<xsl:template match="email">
  <xsl:call-template name="setValidatedEmail">
    <xsl:with-param name="docType">Stockbooks</xsl:with-param>
  </xsl:call-template>
</xsl:template>

实际运行中,local-name-from-QName(node-name($contEm1))能正常返回email,但local-name-from-QName(node-name($contEm2))返回空值。


原因分析

  • $contEm1通过select="."赋值,直接引用当前上下文节点,属于节点引用类型,所以node-name($contEm1)能正确获取原节点的名称。
  • $contEm2采用内容赋值方式,其本质是一个临时文档片段,片段的根是无名的文档节点,而非你拷贝的email节点。node-name($contEm2)获取的是文档节点的名称,自然为空。

解决方案

方案1:获取文档片段中的子节点

修改$contEm2的调用代码,直接取文档片段的子节点(即你拷贝的email节点):

<xsl:value-of select="local-name-from-QName(node-name($contEm2/*))"/>

方案2:用select结合条件表达式赋值

如果你的条件逻辑是决定是否保留节点,直接在select中用条件表达式,避免生成文档片段:

<!-- 示例:根据docType决定是否赋值节点 -->
<xsl:variable name="contEm2" select="if ($docType = 'Stockbooks') then . else ()"/>

这样$contEm2依然是节点引用,可正常用node-name获取名称。

方案3:用xsl:sequence替代xsl:copy-of

若必须用内容赋值方式,用<xsl:sequence>代替<xsl:copy-of>,它会保留节点序列而非生成文档片段:

<xsl:variable name="contEm2">
  <xsl:sequence select="."/>
</xsl:variable>

此时$contEm2为节点序列,node-name($contEm2)可正常获取节点名称(序列仅含一个节点时生效)。


内容的提问来源于stack exchange,提问作者Roebie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 18:06:00