2012-02-13 28 views
0

我無法在下面的示例代碼中獲取id()函數在我的xslt轉換中工作,我不知道爲什麼。當我將data.xml加載到瀏覽器中時,我期望看到每個樣式表/轉換僅顯示'BC'項目的大小值&。有什麼建議麼?供參考:我已經調整了another site的例子。無法讓XSLT select id()函數成功運行

文件:transform.xslt

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="html" indent="yes" encoding="UTF-8" /> 

<xsl:template match="/"> 
    <html> 
     <body>  
      <xsl:value-of select="id('BC')/name" /> 
      <xsl:value-of select="id('BC')/size" />    
     </body> 
    </html> 
</xsl:template> 

文件:data.xml中

<?xml version="1.0" encoding="UTF-8"?> 

<?xml-stylesheet type="text/xsl" href="transform.xslt" ?> 

<provinces xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="data.xsd"> 
<province id="AB"> 
    <name>Alberta</name> 
    <size>33</size> 
</province> 
<province id="BC"> 
<name>British Columbia</name> 
<size>44</size> 
</province> 
<province id="MB"> 
<name>Manitoba</name> 
<size>55</size> 
</province> 
</provinces> 

文件:data.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xs:element name="provinces"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="province" minOccurs="1" maxOccurs="unbounded" /> 
     </xs:sequence> 
    </xs:complexType>  
</xs:element> 

<xs:element name="province"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="name" /> 
      <xs:element name="size" /> 
     </xs:sequence> 
    <xs:attribute name="id" type="xs:ID" use="required"/> 
    </xs:complexType> 
</xs:element>  

</xs:schema> 
+0

您使用的是哪種XSLT處理器? – 2012-02-13 17:31:16

+0

目標是使用Firefox或其他現代瀏覽器(我推測)中的XSLT處理器。它將評估樣式表引用。我沒有得到一個明確的錯誤,當加載上面的XML文件,所以我假設代碼是合法的,不是?你認爲XML文件中的規範可能有問題嗎? – Brian 2012-02-14 03:27:54

回答

2

只是因爲屬性被命名爲id不讓它ID屬性:它必須被聲明爲DTD或模式的ID(也可以命名xml:id如果處理器支持)。

這可能是最簡單的切換到使用key()來代替。

+0

這不是我在模式中所做的嗎? Brian 2012-02-14 03:21:37

+0

試過了key()函數,它工作的很棒!看起來也更加靈活。 (XSLT新手在這裏) – Brian 2012-02-14 03:39:14

+0

@Brian:你忘了接受答案(提示:點擊答案旁邊的複選標記)。如果您不知道另一個事實:Michael Kay是XSLT和XPath(包括1.0和2.0)的一些最佳書籍的作者。 – 2012-02-14 04:04:55

-1

嘗試

<xsl:value-of select="/id('BC')/name" /> 

代替

<xsl:value-of select="id('BC')/name" /> 
+0

這兩個表達式完全等價。 – 2012-02-13 22:34:44

+0

@MichaelKay:實際上,我認爲在XPath 1.0中,第一個表達式甚至在語法上都是合法的。 – 2012-02-14 04:06:27