【发布时间】:2018-12-13 10:53:13
【问题描述】:
我有一个将处理 input.xml 的 transform.xsl 文件。但还有一个额外的 config.xml 文件将定义额外的子句。例如这是 config.xml 的内容。
<Location >
<DisplayName>
<Attribute1>ABC</Attribute1>
<Attribute2>XYZ</Attribute2>
<action>concat($Attribute1,$Attribute2)</action>
</DisplayName>
</Location >
所以当transform.xsl 遇到input.xml 中的DisplayName 变量时,它会用config.xml 文件中定义的动作表达式的RESULT 形成值。 transform.xml 将调用 config.xml 只是为了得到结果。 (最终用户可以修改该操作,因此这些操作位于 xsl 文件之外的 config.xml 中)。
我们使用的是 saxon xml 处理器版本 9 和 xslt 2.0。所以我们需要使用 saxon:evaluate()。我试图找到更多 saxon:evaluate() 的示例,但找不到更多。谁能告诉我一些如何使用它的例子?
提前致谢。
***** 这是一个经过编辑的查询,突出了撒克逊人的需要:评估 *****
【问题讨论】:
-
我在
regex属性中看不到任何正则表达式,相反,它似乎是一个XPath 表达式,对concat函数的调用,其中两个变量或参数引用作为@987654325 的参数@。目前尚不清楚为什么您需要它,而不是仅在样式表或单独的样式表模块中使用普通参数或变量,但一般来说,如果您需要一些动态评估或代码生成和执行,那么迁移到 XSLT 3 可以帮助您有各种选项,如阴影属性、transform函数加上xsl:evaluate(如果支持)来解决此类问题。 -
嗨@MartinHonnen:感谢您的回复。用例是当在 input.xml 中搜索 Location 元素时,它的 DisplayName 将来自 config.xml 文件的 regex 元素。我认为我们需要选择
xsl:evaluate,这是唯一的方法,Saxon 支持这一点。但是,如果我使用<xsl:template match="/"> <xsl:message> VALUE is = <xsl:value-of select="saxon:evaluate($regex)"/> </xsl:message> </xsl:template>,我会收到以下错误 - 提供给 saxon 的 XPath 表达式中的静态错误:评估:XPath 表达式中未声明的变量:$Attribute1 -
您使用的是哪个版本的撒克逊语?您已将您的问题标记为 xslt-2.0,Saxon 因为 9.8 支持 XSLT 3.0,并且我们有
xsl:evaluate元素。在早期版本中,支持扩展函数saxon:evaluate。 -
我看不到任何情况下您会选择使用最新版本的 Saxon 并且更喜欢 saxon:evaluate 而不是 xsl:evaluate。尽管您说您使用的是 XSLT 2.0,但使用 XSLT 3.0 中标准化的特性一定比使用专有的 Saxon 扩展更好,因为两者都在您选择的处理器中可用。在任何情况下,xsl;evaluate 都满足这一要求(允许使用任何名称的变量),而 saxon:evaluate 则不满足(变量必须命名为 $p1、$p2 等)。