XSLT:参数化节点上的递归模板

XSLT:参数化节点上的递归模板,xslt,xslt-3.0,Xslt,Xslt 3.0,我试图递归地调用节点类型的参数化列表上的模板 如果我将这些参数化的值传递给模板,它不会递归。 但是,如果我直接将值传递给模板,递归将按预期工作 在与参数化值进行匹配时,如何使递归工作 我正在使用saxon 9.9.1.6 home edition应用XSLT转换 输入HTML 模板具有直接值的XSLT: 输出: 这是有效的,我期待会发生什么。 但是,当我尝试将参数化值传递给模板时,它匹配顶级元素,但不匹配任何子元素 具有模板参数化值的XSLT: 输出: match=$variable是XSLT

我试图递归地调用节点类型的参数化列表上的模板

如果我将这些参数化的值传递给模板,它不会递归。 但是,如果我直接将值传递给模板,递归将按预期工作

在与参数化值进行匹配时,如何使递归工作

我正在使用saxon 9.9.1.6 home edition应用XSLT转换

输入HTML

模板具有直接值的XSLT:

输出:

这是有效的,我期待会发生什么。 但是,当我尝试将参数化值传递给模板时,它匹配顶级元素,但不匹配任何子元素

具有模板参数化值的XSLT:

输出:

match=$variable是XSLT 3.0中的新语法,它匹配全局变量中保存的节点集中的节点。该变量保存匹配的节点,而不是它们的名称

另外,select=p | a选择文档上下文中的节点,这不是您想要的。使用select='p | a'将变量设置为字符串。使用as属性(例如as=node*或as=xs:string)有助于避免混淆变量实际应该包含的内容

要在名称上进行匹配,请使用match=*[local name=tokenize$container'\|']

或者,您可以定义静态参数和阴影属性:

<xsl:param name="container" select="'p|a'" static="yes"/>

<xsl:template _match="{$container}">...</xsl:template>
或者,如果愿意,可以将变量初始化为匹配节点集,如下所示:

<xsl:param name="matching-nodes" select="//p | //a"/>
然后使用

<xsl:template match="$matching-nodes"/>
但请注意,只有在匹配主源文档中的节点时,这才有效。

match=$variable是XSLT 3.0中的新语法,它匹配全局变量中保存的节点集中的节点。该变量保存匹配的节点,而不是它们的名称

另外,select=p | a选择文档上下文中的节点,这不是您想要的。使用select='p | a'将变量设置为字符串。使用as属性(例如as=node*或as=xs:string)有助于避免混淆变量实际应该包含的内容

要在名称上进行匹配,请使用match=*[local name=tokenize$container'\|']

或者,您可以定义静态参数和阴影属性:

<xsl:param name="container" select="'p|a'" static="yes"/>

<xsl:template _match="{$container}">...</xsl:template>
或者,如果愿意,可以将变量初始化为匹配节点集,如下所示:

<xsl:param name="matching-nodes" select="//p | //a"/>
然后使用

<xsl:template match="$matching-nodes"/>
但请注意,只有在匹配主要源文档中的节点时,这才有效。

编辑:我没有看到凯博士的答案,所以将此作为他的扩展

结果是预期的。从

$xyz匹配变量$xyz值中存在的任何节点。 从

对于全局变量或样式表参数的默认值, 指定变量值的表达式或序列构造函数 使用单例焦点进行评估,如下所示:

如果声明出现在顶级包中,包括顶级包中的xsl:override元素中,则 焦点基于全局上下文项(如果提供或不提供) 否则 如果声明出现在库包中,则焦点不存在。 当前规范很好地警告了全局变量声明的全局上下文项上下文和要处理的第一个项的初始匹配选择之间可能存在的差异,但这让您需要在XSLT处理器自己的文档中查看哪些是默认设置

我将假设以下情况以注释形式表示:

注:

在本规范的早期版本中,使用了单个节点 通常用于表示 转型此节点用作隐式表达式的目标节点 调用xsl:apply用于启动转换过程的模板 现在称为初始匹配选择,以及 使用包含树作为上下文项来评估全局 变量现在称为全局上下文项。[…]

这与以下工作流程相结合:

变量$container在文档节点的上下文中设置 或根:表达式选择p文档元素。 文档节点或根由内置规则匹配。申请 模板给孩子们。 文档元素p与模板匹配。输出您的 内容模板和将模板应用于子级。 p文档元素的每五个子元素都由内置的 规则:输出两个纯空白文本节点,输出三个元素 绕过。 此处的三个文本节点(第1段、第2段和链接)是 输出 编辑:我没有看到凯博士的答案,所以把这当作是对他的扩展

结果是预期的。从

$xyz匹配变量$xyz值中存在的任何节点。 从

对于全局变量或样式表参数的默认值, 表达或 指定变量值的序列构造函数 使用单例焦点进行评估,如下所示:

如果声明出现在顶级包中,包括顶级包中的xsl:override元素中,则 焦点基于全局上下文项(如果提供或不提供) 否则 如果声明出现在库包中,则焦点不存在。 当前规范很好地警告了全局变量声明的全局上下文项上下文和要处理的第一个项的初始匹配选择之间可能存在的差异,但这让您需要在XSLT处理器自己的文档中查看哪些是默认设置

我将假设以下情况以注释形式表示:

注:

在本规范的早期版本中,使用了单个节点 通常用于表示 转型此节点用作隐式表达式的目标节点 调用xsl:apply用于启动转换过程的模板 现在称为初始匹配选择,以及 使用包含树作为上下文项来评估全局 变量现在称为全局上下文项。[…]

这与以下工作流程相结合:

变量$container在文档节点的上下文中设置 或根:表达式选择p文档元素。 文档节点或根由内置规则匹配。申请 模板给孩子们。 文档元素p与模板匹配。输出您的 内容模板和将模板应用于子级。 p文档元素的每五个子元素都由内置的 规则:输出两个纯空白文本节点,输出三个元素 绕过。 此处的三个文本节点(第1段、第2段和链接)是 输出 根据,需要用反斜杠转义“|”正则表达式。有了这个改变,我就成功了。谢谢。根据,需要用反斜杠转义“|”正则表达式。有了这个改变,我就成功了。谢谢
<xsl:param name="matching-nodes" select="//p | //a"/>
<xsl:template match="$matching-nodes"/>