2010-03-25 44 views
3

例如标签号:这是一个XSLT短手对于具有更长[和几乎相同]的Xpath

<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"/> 

在上述代码中,我可以使用XPath /root/sub-root/parent/child/grand_child/dummy1/dummy2/dummy3/dummy4 只有一次[使用括号或无论]并减少代码的庞大程度?如你所见,所有的节点都是彼此的兄弟姐妹,所以除了他们的名字他们的Xpath是相同的。有没有什么短暂的财产?

XSLT 1.0(或Xpath1.0)允许吗?

+0

问得好,@infant程序员(+1 )。您很少需要在匹配模式中指定节点的完整路径 - 请参阅我的答案。 – 2010-03-25 13:21:16

回答

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要忽略任何节点,只是下降的[..]

3

问问自己是否真的有必要使用特定的长表达式。我发现这只是一个示例,但您并不需要将完整路径包含到元素中,只是尽可能多地使其成为明确的。

另外,我提醒你self轴:

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

如果名字的结构和可预测的,你可以做

<xsl:template match="/.../dummy4/*[substring-before(name(), '_') = 'node']" /> 
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) 
        ] 

然而,match patterns只是所有XPath表达式一个子集,并且有一定的限制对他们的应用。特别是,在XSLT 1.0中,不能包含对xsl:变量的引用。

如果值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 
+0

如果节点名称不相同怎么办?我的意思是node_1,node_2只是一个例子..在典型的例子中,我不会有他们.. – 2010-03-25 14:43:26

+0

@ infant-programmer,那么你需要在一个单独的结构中包含所有可能的元素名称,并比较eac的名称元素正在使用此结构中的名称进行处理。从本质上讲,我们正在讨论一个单独的“查找文件”。这成为另一个问题,你可能想问一下。 :) – 2010-03-25 19:41:46

+0

不,谢谢,我想我永远都不需要它,Ledhund的建议一直满足我的需要,你也澄清了很多东西:)谢谢:) – 2010-03-26 05:31:22