3

例如:这是一个 xslt

<xsl:template match="/root/sub-root/parent/child/grand_child/dummy1/dummy2/dummy3/dummy4/node_1
|/root/sub-root/parent/child/grand_child/dummy1/dummy2/dummy3/dummy4/node_2
|/root/sub-root/parent/child/grand_child/dummy1/dummy2/dummy3/dummy4/node_3
 .
 .
|/root/sub-root/parent/child/grand_child/dummy1/dummy2/dummy3/dummy4/node_N"/>

在上面的代码中,我可以 /root/sub-root/parent/child/grand_child/dummy1/dummy2/dummy3/dummy4 只使用一次 XPath [使用大括号或其他] 并减少代码的体积吗?

如您所见,所有节点都是彼此的兄弟,所以除了它们的名称之外,它们的 Xpath 是相同的。有没有短手财产?

XSLT 1.0(或 Xpath1.0)是否允许它?

4

3 回答 3

3

问问自己是否真的需要长的特定匹配表达式。我看到这只是一个示例,但您实际上不必包含元素的完整路径,只需使其明确即可。

此外,我提醒您self轴:

<xsl:template match="/.../dummy4/*[self::node_1 or self::node_2 ...]" />

如果名称是结构化且可预测的,您可以这样做

<xsl:template match="/.../dummy4/*[substring-before(name(), '_') = 'node']" />
于 2010-03-25T11:19:52.757 回答
2

XSLT 1.0(或 Xpath1.0)是否允许它?

以下是正确的 XPath 1.0 表达式

root/sub-root/parent/child/grand_child
              /dummy1/dummy2/dummy3/dummy4
                /*
                 [starts-with(name(), 'node_')
                and
                  substring-after(name(), 'node_') >= 1
                and
                  not(substring-after(name(), 'node_') > $N)
                  ]

但是,匹配模式只是所有 XPath 表达式的一个子集,并且对它们应用了某些限制。特别是,在 XSLT 1.0 中,它们不能包含对 xsl:variable 的引用

如果值 N 是静态已知的,那么将在上面的 XPath 表达式中替换此文字值(例如 1000),从而具有有效的 XSLT 1.0 匹配模式。

请注意,这是一种极端情况,在任何实际情况下都极不可能需要如此长的匹配模式。根据定义,匹配模式不需要指定节点的完整路径——只需要一个足够的“从右子路径”来区分节点与必须由不同模板处理的其他同名节点。

因此,在大多数情况下,甚至以下内容就足够了

 *
 [starts-with(name(), 'node_')
and
  substring-after(name(), 'node_') >= 1
and
   not(substring-after(name(), 'node_') > {N})

 ]

其中 {N} 必须替换为整数文字 - $N 的实际值。

或者,在最简单的情况下(经常发生),如果有四个节点并且不需要消歧,则只需使用:

 node_1|node_2|node_3|node_4
于 2010-03-25T13:16:15.900 回答
1

仅在在线 xpath 工具中对其进行了测试,因此不完全确定,但它应该可以工作

<xsl:template match="/root/sub-root/parent/child/grand_child/dummy1/dummy2/dummy3/dummy4/node()[name() = 'node_1' or name()='node_2' ... or name()='node_N']"/>

如果您想省略 dummy4 中没有任何节点,只需删除 [..]

于 2010-03-25T08:23:31.420 回答