无法使XSLT select id()函数成功运行

时间:2012-02-13 16:43:59

标签: xml xpath xslt-2.0

根据下面的示例代码,我无法在我的xslt转换中使用id()函数,我不知道为什么。当我将data.xml加载到浏览器中时,我希望只看到名称&每个样式表/转换的'BC'项的大小值。有什么建议?仅供参考:我已经改编了another site的例子。

文件: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>

3 个答案:

答案 0 :(得分:3)

仅仅因为该属性被命名为id并不使其成为ID属性:它必须在DTD或模式中声明为ID(或者如果处理器支持,则可以将其命名为xml:id)。

这里切换到使用key()可能是最简单的。

答案 1 :(得分:0)

由于XSL 2.0使用与XQuery 1.0 / XPath 2.0相同的功能,您还可以使用函数 fn:element-with-id。此函数解决了fn:id(...)仅适用于xml:id属性(而非xs:ID)的问题。

在此处详细了解此信息:How to use the XQuery fn:id() function?

答案 2 :(得分:-1)

尝试

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

而不是

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