Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 无法使XSLT select id()函数成功运行_Xml_Xpath_Xslt 2.0 - Fatal编程技术网

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

Xml 无法使XSLT select id()函数成功运行,xml,xpath,xslt-2.0,Xml,Xpath,Xslt 2.0,根据下面的示例代码,我很难让id()函数在xslt转换中工作,我不知道为什么。当我将data.xml加载到浏览器中时,我希望每个样式表/转换只看到“BC”项的名称和大小值。有什么建议吗?仅供参考:我已经从中改编了这个例子 文件:transform.xslt <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Tran

根据下面的示例代码,我很难让id()函数在xslt转换中工作,我不知道为什么。当我将data.xml加载到浏览器中时,我希望每个样式表/转换只看到“BC”项的名称和大小值。有什么建议吗?仅供参考:我已经从中改编了这个例子

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

阿尔伯塔省
33
不列颠哥伦比亚省
44
马尼托巴省
55
文件: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>

试试看


而不是

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

仅仅因为属性名为id,并不意味着它就是id属性:它必须在DTD或模式中声明为id(如果处理器支持,也可以将其命名为xml:id)


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

由于XSL 2.0使用了与XQuery 1.0/XPath 2.0相同的函数,您也可以使用该函数。此函数解决了以下问题:
fn:id(…)
仅适用于
xml:id
属性(而不适用于
xs:id


请在此处阅读更多信息:。

您使用的XSLT处理器是什么?目标是使用Firefox或其他现代浏览器中的XSLT处理器(我猜)。它将评估样式表引用。加载上面的xml文件时,我没有收到明显的错误,所以我假设代码是合法的,不是吗?您认为XML文件中的规范可能有问题吗?这两个表达式完全相同。@MichaelKay:事实上,我认为在XPath 1.0中,第一个表达式在语法上甚至不合法。这不是我在模式中所做的吗?尝试了key()函数,效果很好!看起来也更灵活。(这里是XSLT新手)@Brian:你忘记接受答案了(提示:点击答案旁边的复选标记)。如果您不知道另一个事实:Michael Kay是一些关于XSLT和XPath(1.0和2.0)的好书的作者。
<xsl:value-of select="id('BC')/name" />