XSLT中通过select与内容赋值变量获取节点名的差异求助
问题:通过变量内容赋值无法获取节点名称
我在基于Altova引擎、采用XSLT 2.0的可变数据发布专有软件平台上遇到问题:使用select属性为变量赋值时,可正常获取节点名称;但通过变量内容(结合<xsl:copy-of>)赋值时,无法获取节点名。由于需要实现条件逻辑,必须让后者生效,恳请解决。
相关代码如下:
命名模板代码
<xsl:template name="setValidatedEmail"> <xsl:param name="docType"/> <xsl:variable name="break" select="' '"/> <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
相关产品推荐
相关产品推荐

