根据下面的示例代码,我无法在我的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>
答案 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" />