gpt4 book ai didi

XSLT 3.0 动态选择应用模板中的变量?

转载 作者:行者123 更新时间:2023-12-01 04:47:17 26 4
gpt4 key购买 nike

我想将模板应用于一组节点,其中 select 的一部分路径是一个变量。我正在使用 Saxon-HE 9.8(很棒的库!)

我正在努力实现以下目标

<variable name="x" select="string('baz')"/>
<xsl:apply-templates select="foo/bar/$x"/>

这似乎不起作用。是否有允许我为此 apply-templates 动态构建选择 XPath 的语法?操作说明?或者,是否有另一种技术可以动态实现这种效果?我什至试着把它推到我的 <xsl:template match=foo/bar/$x>但没有运气。

我的动机是在我的应用程序中,变量值来自一个单独的配置文件。根据配置,我需要运行匹配由配置字符串驱动的特定路径段的模板...

最佳答案

如果您声明 static parameter <xsl:param name="x" static="yes" as="xs:string" select="'baz'"/>对于该值,然后使用 shadow attribute_select="foo/bar/{$x}" 的形式您甚至可以动态构造路径,但仅限于编译 XSLT 时。

在静态参数中,您当然可以拉入配置文件并使用其中的值:

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

<xsl:param name="config-uri" static="yes" as="xs:string" select="'https://martin-honnen.github.io/xslt/2018/config-example1.xml'"/>
<xsl:param name="config-doc" static="yes" as="document-node()" select="doc($config-uri)"/>

<xsl:mode on-no-match="shallow-copy"/>

<xsl:template match="item[@type = 'foo']">
<xsl:copy>
<xsl:value-of _select="{$config-doc/map/from[@key = 'foo']}"/>
</xsl:copy>
</xsl:template>

<xsl:template match="item[@type = 'bar']">
<xsl:copy>
<xsl:value-of _select="{$config-doc/map/from[@key = 'bar']}"/>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/6qVRKvX/1

我在第一个答案中没有提到的另一个选项,但这也是 Saxon 9.8 或任何其他 XSLT 3 处理器的可行方法是使用 XSLT 创建 XSLT,然后使用 transform函数 ( https://www.w3.org/TR/xpath-functions/#func-transform ) 来运行生成的 XSLT。这种方法的优点是它适用于 Saxon 9.8 HE,其中 xsl:evaluate不支持:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:axsl="http://www.w3.org/1999/XSL/Transform-alias"
exclude-result-prefixes="axsl"
version="3.0">

<xsl:param name="config-uri" as="xs:string" select="'https://martin-honnen.github.io/xslt/2018/config-example1.xml'"/>
<xsl:param name="config-doc" as="document-node()" select="doc($config-uri)"/>

<xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>

<xsl:variable name="generated-xslt">
<axsl:stylesheet version="3.0">
<axsl:mode on-no-match="shallow-copy"/>
<xsl:for-each select="$config-doc/map/from">
<axsl:template match="item[@type = '{@key}']">
<axsl:copy>
<axsl:value-of select="{.}"/>
</axsl:copy>
</axsl:template>
</xsl:for-each>
</axsl:stylesheet>
</xsl:variable>

<xsl:mode on-no-match="shallow-copy"/>

<xsl:template match="/">
<xsl:sequence
select="transform(map {
'source-node' : .,
'stylesheet-node' : $generated-xslt
})?output"/>
</xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/6qVRKvX/2

关于XSLT 3.0 动态选择应用模板中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50224145/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com