Не удалось добиться успешной работы функции XSLT select id ()

Мне не удается заставить функцию 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>

File: 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>

person Brian    schedule 13.02.2012    source источник
comment
Какой XSLT-процессор вы используете?   -  person Kirill Polishchuk    schedule 13.02.2012
comment
Цель состоит в том, чтобы использовать процессор XSLT, который есть в Firefox или другом современном браузере (я полагаю). Это тот, который будет оценивать ссылку на таблицу стилей. Я не получаю явной ошибки при загрузке XML-файла выше, поэтому я предполагаю, что код правильный, не так ли? Как вы думаете, может быть что-то не так со спецификацией в XML-файле?   -  person Brian    schedule 14.02.2012


Ответы (3)


Тот факт, что атрибут назван id, не делает его атрибутом ID: он должен быть объявлен как идентификатор в DTD или схеме (или его можно назвать xml: id, если процессор это поддерживает).

Вероятно, здесь проще всего переключиться на использование key ().

person Michael Kay    schedule 13.02.2012
comment
Разве это не то, что я сделал в схеме? ‹Xs: attribute name = id type = xs: ID use = required /› - person Brian; 14.02.2012
comment
Пробовал функцию key (), отлично работает! Кажется, тоже намного более гибким. (Здесь новичок в XSLT) - person Brian; 14.02.2012
comment
@Brian: Вы забыли принять ответ (Подсказка: нажмите на галочку рядом с ответом). На случай, если вы не знали еще об одном факте: Майкл Кей является автором нескольких лучших книг по XSLT и XPath (как 1.0, так и 2.0). - person Dimitre Novatchev; 14.02.2012

Поскольку XSL 2.0 использует те же функции, что и XQuery 1.0 / XPath 2.0, вы также можете использовать функцию fn:element-with-id. Эта функция решает проблему, связанную с тем, что fn:id(...) работает только с xml:id атрибутами (а не с xs:ID).

Подробнее об этом читайте здесь: Как использовать XQuery fn: функция id ()?.

person Dennis Münkle    schedule 14.02.2012

Пытаться

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

вместо того

<xsl:value-of select="id('BC')/name" />
person Sean B. Durkin    schedule 13.02.2012
comment
Эти два выражения полностью эквивалентны. - person Michael Kay; 14.02.2012
comment
@MichaelKay: На самом деле, я не думаю, что в XPath 1.0 первое выражение даже синтаксически допустимо. - person Dimitre Novatchev; 14.02.2012