XSL 是一种 XML 格式的声明性语言。 XSLT 文件必须是格式正确的 XML。
您尝试的内容看起来您具有命令式语言的编程知识,您可以在其中编写像"ABC" + $var1 这样的表达式。然而,这违反了 XSL 中的 XML 格式规则。元素遵循模式<elementname attribute1="value1" attributeN="valueN">...</elementname>。在您的代码中,您将 +$var1 放在 myAttr 属性的末尾,该属性以第二个引号结尾 - 这是无效的:<frequency myAttr="ABC"+$var1 >
<frequency myAttr="ABC+$var1"> 会产生 ABC+$var1 的文字属性值,这不是您想要的。如果您尝试使用 XPath 语法作为属性值,concat('ABC', $var1) 作为来自<frequency myAttr="concat('ABC', $var1)"> 的字符串,也会发生这种情况。
您可以使用 michael.hor257k 建议的属性值模板语法,这实质上意味着将 XPath 表达式包装在属性值字符串内的大括号中。
另一种方法是不在代码中将元素写为文字,而是声明它:
<xsl:variable name="var1" select="'DEF'"/>
<xsl:element name="frequency">
<xsl:attribute name="myAttr">
<xsl:value-of select="concat('ABC', $var1)"/>
</xsl:attribute>
</xsl:element>
请注意,我更正了变量定义:在select 属性中,如果应该是字符串,则必须将DEF 放在单引号中,例如select="'DEF'"。如果没有单引号,您可以定义变量以引用源 XML 中的 <DEF> 元素。
在<xsl:value-of> 的select 属性中,我使用XPath 函数concat() 连接字符串'ABC' 和变量$var1 的内容。此处不能使用属性值模板语法:select="'ABC{$var1}'" 将产生字符串ABC{$var1}。
上面例子的一个变体是使用<xsl:text>作为字符串ABC和<xsl:value-of>来输出$var1的内容:
<xsl:variable name="var1" select="'DEF'"/>
<xsl:element name="frequency">
<xsl:attribute name="myAttr">
<xsl:text>ABC</xsl:text>
<xsl:value-of select="$var1"/>
</xsl:attribute>
</xsl:element>
所以有三种解决方案,一种是简洁的,一种是声明性的。你选择哪一个取决于你。打字最快的肯定是第一个:
<xsl:variable name="var1" select="'DEF'"/>
<frequency myAttr="ABC{$var1}">
<xsl:value-of select="frequency"/>
</frequency>
...但您还应该了解实现相同结果的两种声明方式并了解它们的工作原理。