2012-02-29 40 views
1

我想,將獲得的元素的命名空間multiole調用模板來指定匹配表達式:模板匹配 - 如何指定或conditon

<xsl:template match="*[namespace-uri()='abc.com' or namespace-uri()='def.com']"> 
    ... 
</xsl:template> 

但這似乎並沒有工作。只有在表達式的左邊或表達式爲真時纔會調用它。

回答

1

使用命名空間的常用方法是聲明它們,例如

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0" 
    xmlns:abc="http://example.com/abc" 
    xmlns:def="http://example.com/def" 
    exclude-result-prefixes="abc def"> 

<xsl:template match="abc:* | def:*">...</xsl:template> 

... 

</xsl:stylesheet> 

話雖這麼說,我看不出有什麼毛病你or謂詞表達式,比你還沒有爲您提供使用任何輸入其他。

+0

我不能使用'abc:*'和'def:*',因爲它們可能與文件不同,但它們總是使用相同的名稱空間uri。一個文件可能是xmlns:abc =「xxx」,另一個文件可能是xmlns:bcd =「xxx」,所以我只能使用namespace-uri()='xxx'。 我的測試案例工作,所以我必須有其他錯誤。謝謝。 – bretter 2012-02-29 14:28:19

+1

bretter,你是否知道在XSLT樣式表中選擇的前綴不需要匹配XML輸入中的前綴?所以你可以使用我發佈的方法,只需選擇你想要的前綴,用XML輸入的名稱空間URI聲明它,然後編寫你的樣式表。這樣,即使X​​ML輸入使用不同的前綴,匹配或選擇也會起作用,只要URI匹配。 – 2012-02-29 15:37:05

0
<xsl:template match="*[namespace-uri()='abc.com' or namespace-uri()='def.com']"> 
     ... 
    </xsl:template> 

But this does not seem to work. 

是正確的代碼

所以,問題出在您還沒有向我們展示的代碼中。請提供一個簡單的XML文檔,以便每個人都可以將提供的XSLT代碼應用到提供的XML文檔並重現問題。

這裏是一個演示了 「疑似」 的代碼是正確

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="*[namespace-uri()='def.com' or namespace-uri()='abc.com']"> 
    <xsl:copy-of select="."/> 
</xsl:template> 
</xsl:stylesheet> 

當這一轉型是這個XML文檔施加:

<a> 
<b:b xmlns:b="abc.com"> 
    <c/> 
</b:b> 
<f/> 
<d:d xmlns:d="def.com"> 
    <e/> 
</d:d> 
</a> 

想要的,正確的結果產生

<b:b xmlns:b="abc.com"> 
    <c/> 
</b:b> 
<d:d xmlns:d="def.com"> 
    <e/> 
</d:d>