【问题标题】:Why doesn't it see the variable inside element declaration?为什么它看不到元素声明中的变量?
【发布时间】:2012-02-13 03:28:50
【问题描述】:

以下代码报错:

[1.0-ml] XDMP-UNDVAR: (err:XPST0008) Undefined variable $ename

但是,如果我将 xsl:element 更改为 <xsl:element name="yyyXXX"> 它表明它看到 $ename 的价值,即

<yyyXXX>zzz</yyyXXX>

下面的样式表在 Saxonica 9.x 中运行良好

谢谢。


xquery version "1.0-ml";

xdmp:xslt-eval(
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:xdmp="http://marklogic.com/xdmp"        
   extension-element-prefixes="xdmp"
    version="2.0">     

 <xsl:template match="/">
  <xsl:variable name="ename" select="'zzz'"/>
  <xsl:element name="yyy{$ename}">       
   <xsl:value-of select="$ename"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>
,document{ <doc/> })

【问题讨论】:

  • 应该可以的。您能否在 marklogic.com 上提交一份错误报告以供支持?不幸的是,我想不出解决办法。
  • 我使用的是快速版本,我没有支持合同。是的,在我看来也是一个错误。
  • 我相信您仍然可以将此错误发送给他们。
  • 不是错误。请参阅贾斯汀的回答。 $ename 变量在 XSLT 样式表的构造中进行评估。您需要双花括号来插入文字。

标签: xslt marklogic


【解决方案1】:

您需要在元素名称周围使用两组大括号,例如yyy{{$ename}}。这告诉外部 XQuery 将它们视为 XSLT 中的文字大括号。如果您从外部文档调用 XSLT(例如使用 xdmp:xslt-invoke),则不需要额外的括号;这相当于你的撒克逊测试。评估 XQuery 以动态创建 XSLT 的能力非常强大,但确实会带来更多的认知开销。

【讨论】:

  • 如果您想在处理嵌入式 XSLT 的结果中输出大括号(例如,生成另一个样式表),这会变得非常混乱。然后你必须写四个花括号来得到一个,例如:xdmp:xslt-eval(&lt;element attribute="{{{{bracketed}}}}" xsl:version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" /&gt;, &lt;empty/&gt;)输出&lt;element attribute="{bracketed}"/&gt;
  • 是的,可以。这就是我通常使用xdmp:xslt-invoke 而不是eval 的原因之一。 (我通常也不需要动态生成我的 XSLT。)您可以在调用的样式表上获得一些额外的缓存,而这些缓存在 eval 上是无法完成的。不过,如果需要动态生成 XSLT,xdmp:xslt-eval 是不错的选择。
  • 谢谢你,现在工作正常。啊,这是一个令人讨厌的问题,至少我们现在知道了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 2023-02-20
相关资源
最近更新 更多