Невозможно заставить функцию XSLT select id () работать успешно - PullRequest
0 голосов
/ 13 февраля 2012

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

Файл: 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 ]

3 голосов
/ 14 февраля 2012

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

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

0 голосов
/ 14 февраля 2012

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

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

0 голосов
/ 14 февраля 2012

Попробуйте

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

вместо

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