Xml 无法使XSLT select id()函数成功运行
根据下面的示例代码,我很难让id()函数在xslt转换中工作,我不知道为什么。当我将data.xml加载到浏览器中时,我希望每个样式表/转换只看到“BC”项的名称和大小值。有什么建议吗?仅供参考:我已经从中改编了这个例子 文件:transform.xsltXml 无法使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
<?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" />