2012-10-29 68 views
0

鑑於以下XSLT:匹配一個節點沒有命名空間,XSLT

<stylesheet version="2.0" 
    xmlns="http://www.w3.org/1999/XSL/Transform" 
    xmlns:cm="http://api.example.com/schema"> 

    <template match="?"> 
     <element name="cm:Foo"><value-of select="?" /></element> 
    </template> 

</stylesheet> 

而這個XML:

<a> 
    <b>cat</b> 
</a> 

我如何a節點匹配和選擇b節點的值?

請注意,它們沒有任何名稱空間,並且樣式表中的默認名稱空間已被使用,所以只需match="a"select="b"將不起作用(據我所見)。

+1

你有沒有用'match =「a」'和'select =「b」'試試看看會發生什麼? ;) –

+1

是的,這就是爲什麼我問;) – Svish

回答

0
<xsl:template match="a"> 
    <xsl:value-of select="b"/> 
</xsl:template> 

應該這樣做,因爲樣式表中的默認命名空間對於XSLT模式和XPath表達式無關緊要。因此,a始終表示一個名稱空間中本地名稱爲a的元素,除非您使用XSLT 2.0並設置了xpath-default-namespace="...",請參閱http://www.w3.org/TR/xslt20/#unprefixed-qnames。你的xmlns="..."沒關係。

1

一個XML文檔(您的XSLT樣式表)的默認名稱空間不能以任何方式影響另一個 XML文檔是否具有默認名稱空間。

只需使用

<xsl:template match="a"> 
    <xsl:value-of select="b"/> 
</xsl:template> 

另外,記住的XPath始終把前綴的名稱爲屬於 「沒有命名空間」。

0

@pgfearo發佈並刪除了一個正確的答案。解決方案是在stylesheet上設置xpath-default-namespace=""。因此,工作XSLT是:

<stylesheet version="2.0" 
    xmlns="http://www.w3.org/1999/XSL/Transform" 
    xmlns:cm="http://api.example.com/schema" 
    xpath-default-namespace=""> 

    <template match="a"> 
     <element name="cm:Foo"><value-of select="b" /></element> 
    </template> 

</stylesheet> 

沒有設置xpath-default-namespace不匹配,這是有道理的,因爲沒有與XSL無ab節點轉換命名空間。