2009-10-13 53 views
2

我想從以下列表中的XML有前綴的命名空間節點:XSL變換,選擇前綴命名空間?

<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01"> 
<Cube> 
    <Cube time="2009-10-12"> 
     <Cube currency="USD" rate="1.4765"/> 
     ............................. 

我使用XSL是(更新): 原始XML是:http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:template match="/"> 
    <xdoc> 
     <ccurency> 
     <xsl:for-each select="gesmes:Envelope/Cube/Cube"> 
<xsl:variable name="atime" select="@time"/> 
     <xsl:for-each select="Cube"> 
       <row> 
       <xsl:element name="Date"> 
       <xsl:value-of select="$atime"/> 
       </xsl:element>  
         <xsl:element name="Currency"> 
       <xsl:value-of select="@currency"/> 
       </xsl:element> 
       <xsl:element name="Rate"> 
       <xsl:value-of select="@rate"/> 
       </xsl:element> 
     </row> 
     </xsl:for-each> 
    </xsl:for-each> 
    </ccurency>   
</xdoc>     
</xsl:template> 
</xsl:stylesheet> 

這不起作用,選擇是空的。如果我將gesmes:Envelope改爲xml和xsl中的簡單Envelope,一切正常?

如何用前綴選擇它?

回答

2

看來你正在尋找的東西是這樣的:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" 
    xmlns:exr="http://www.ecb.int/vocabulary/2002-08-01/eurofxref" 
    exclude-result-prefixes="gesmes exr" 
> 
    <xsl:output method="xml" indent="yes" encoding="utf-8" /> 

    <xsl:template match="gesmes:Envelope"> 
    <xdoc> 
     <ccurency> 
     <xsl:apply-templates select="exr:Cube/exr:Cube/exr:Cube" /> 
     </ccurency> 
    </xdoc> 
    </xsl:template> 

    <xsl:template match="exr:Cube[@currency and @rate]"> 
    <row> 
     <Date> 
     <xsl:value-of select="../@time" /> 
     </Date> 
     <Currency> 
     <xsl:value-of select="@currency" /> 
     </Currency> 
     <Rate> 
     <xsl:value-of select="@rate" /> 
     </Rate> 
    </row> 
    </xsl:template> 

</xsl:stylesheet> 

當適用於您的輸入XML,它產生:

<xdoc> 
    <ccurency> 
    <row> 
     <Date>2009-07-16</Date> 
     <Currency>PHP</Currency> 
     <Rate>67.739</Rate> 
    </row> 
    <row> 
     <Date>2009-07-16</Date> 
     <Currency>SGD</Currency> 
     <Rate>2.0501</Rate> 
    </row> 
    <row> 
     <Date>2009-07-16</Date> 
     <Currency>THB</Currency> 
     <Rate>48.13</Rate> 
    </row> 
    <row> 
     <Date>2009-07-16</Date> 
     <Currency>ZAR</Currency> 
     <Rate>11.4575</Rate> 
    </row> 
    </ccurency> 
</xdoc> 

注:

  • 不要儘可能使用<xsl:for-each>。它看起來比<xsl:apply-templates>更爲熟悉,也不那麼可怕,但大多數時候它並不是最好的選擇。
  • 您不需要使用<xsl:element>構建元素,您可以直接編寫它們。
  • 你不需要一個變量存儲與@time值你有興趣,你可以隨時參考父節點,並從那裏把它直接(../@time
  • 我以前exclude-result-prefixes使命名空間從消失輸出完全,你似乎想擺脫他們
+0

感謝您的寶貴幫助。有用! – 2009-10-14 11:17:58

3

確保您已經聲明在變換的根元素的命名空間:

<xsl:stylesheet xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

看你的邏輯和輸入XML,它看起來像內部的for-each絕不會選擇的節點,因爲上下文更改爲內部<cube>元素,名稱空間或否。這可能僅僅是縮短您的XML的問題,但是結果......

+0

謝謝,我發表我的意見作爲新的答案,由於字符限制。 – 2009-10-14 08:36:55