变量 XSLT 中的循环变量/参数引用

Bat*_*eam 6 java xml xslt

我有一个简单的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="form.xsl"?>
<x>
    <y>Hello</y>
</x>
Run Code Online (Sandbox Code Playgroud)

form.xsl

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

<xsl:output encoding="UTF-8" method="xml" indent="yes"/>
<xsl:variable name="topLevel">
        <xsl:variable name="inner" select="'Hi'" />
        <xsl:value-of select="$inner"/>
</xsl:variable>

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


</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

我正在使用JRE 1.8,,当我使用 转换 XML 时javax.xml.transform.Transformer,我在变量上收到循环引用错误topLevel

Circular variable/parameter reference in '[variable(topLevel)]
Run Code Online (Sandbox Code Playgroud)

我发现已经有一个与此相关的问题记录在:JIRA,但不确定是否已修复。

提供了各种解决方法,但没有提供解决方案。

注意:我没有包含任何第三方 jar,并且使用默认的 Transformer 实现。

小智 0

该问题是由于(全局)变量中的变量定义造成的。

如果移动此行 <xsl:variable name="inner" select="'Hi'" />

在“topLevel”定义之外,那么您的代码可能会工作。

这种事情在 Xalan 2.7.0 中没问题,但在 2.7.1/2 中会触发错误消息

我写这篇文章是因为我今天遇到了同样的问题,这个答案在谷歌中排名第一,尽管它已经有 7 年历史了。

我无法告诉您为什么引入 Xalan 行为的这种变化,只是我观察到了同样的事情,这是我找到的解决方法