我想,將獲得的元素的命名空間multiole調用模板來指定匹配表達式:模板匹配 - 如何指定或conditon
<xsl:template match="*[namespace-uri()='abc.com' or namespace-uri()='def.com']">
...
</xsl:template>
但這似乎並沒有工作。只有在表達式的左邊或表達式爲真時纔會調用它。
我想,將獲得的元素的命名空間multiole調用模板來指定匹配表達式:模板匹配 - 如何指定或conditon
<xsl:template match="*[namespace-uri()='abc.com' or namespace-uri()='def.com']">
...
</xsl:template>
但這似乎並沒有工作。只有在表達式的左邊或表達式爲真時纔會調用它。
使用命名空間的常用方法是聲明它們,例如
<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
謂詞表達式,比你還沒有爲您提供使用任何輸入其他。
<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>
我不能使用'abc:*'和'def:*',因爲它們可能與文件不同,但它們總是使用相同的名稱空間uri。一個文件可能是xmlns:abc =「xxx」,另一個文件可能是xmlns:bcd =「xxx」,所以我只能使用namespace-uri()='xxx'。 我的測試案例工作,所以我必須有其他錯誤。謝謝。 – bretter 2012-02-29 14:28:19
bretter,你是否知道在XSLT樣式表中選擇的前綴不需要匹配XML輸入中的前綴?所以你可以使用我發佈的方法,只需選擇你想要的前綴,用XML輸入的名稱空間URI聲明它,然後編寫你的樣式表。這樣,即使XML輸入使用不同的前綴,匹配或選擇也會起作用,只要URI匹配。 – 2012-02-29 15:37:05