2010-03-25 50 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