В XSL как выбрать значение на основе нескольких атрибутов? - PullRequest
2 голосов
/ 09 августа 2010

Это, должно быть, очень простой вопрос, но я действительно борюсь с решением.Из следующего XML я пытаюсь извлечь только первый экземпляр, когда у меня есть совпадение атрибутов tag="099" и code="a" в узле marc:datafield и узле marc:subfield соответственно

<?xml version="1.0" encoding="UTF-8" ?>
<marc:collection xmlns:marc="http://www.loc.gov/MARC21/slim"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd">
<marc:record>
    ...
    <marc:datafield tag="079" ind1=" " ind2=" ">
        <marc:subfield code="a">79927839</marc:subfield>
    </marc:datafield>
    <marc:datafield tag="099" ind1=" " ind2=" ">
        <marc:subfield code="a">940002</marc:subfield>
    </marc:datafield>
    <marc:datafield tag="099" ind1=" " ind2=" ">
        <marc:subfield code="a">940002*</marc:subfield>
    </marc:datafield>
    <marc:datafield tag="099" ind1=" " ind2=" ">
        <marc:subfield code="a">940002**</marc:subfield>
...        

Итак, я пытаюсь получить первый «940002».Используя следующий код:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs"
version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/"
xmlns:marc="http://www.loc.gov/MARC21/slim">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
    <record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/">
        <!--identifier-->
        <xsl:if test="/marc:collection/marc:record/marc:datafield/@tag='099'">
            <xsl:element name="dc:identifier">
                <xsl:if test="position()=1">
                    <xsl:value-of select="/marc:collection/marc:record/marc:datafield/marc:subfield/@code='a'"/>
                </xsl:if>
            </xsl:element>
        </xsl:if>
...

Тем не менее, я получаю:

<?xml version="1.0" encoding="UTF-8"?>
<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:dcterms="http://purl.org/dc/terms/"
    xmlns:marc="http://www.loc.gov/MARC21/slim">
   <dc:identifier>true</dc:identifier>
   ...

Вместо желаемого:

       <?xml version="1.0" encoding="UTF-8"?>
<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:dcterms="http://purl.org/dc/terms/"
    xmlns:marc="http://www.loc.gov/MARC21/slim">
   <dc:identifier>940002</dc:identifier>
   ...

Я предполагаючто это должно быть проблемой Xpath, но ... Любые ссылки будут оценены.

Спасибо

Ответы [ 3 ]

2 голосов
/ 10 августа 2010

Используйте

/marc:collection/marc:record/marc:datafield
                   [@tag='099']/marc:subfield[@code='a'][1]/text()
2 голосов
/ 09 августа 2010

Измените

<xsl:value-of select="/marc:collection/marc:record/marc:datafield/marc:subfield/@code='a'"/>

на

 <xsl:value-of select="/marc:collection/marc:record/marc:datafield/marc:subfield[@code='a']/text()"/>

Вы выбираете, равен ли @code 'a' вместо marc:subfieldгде @code='a'

1 голос
/ 10 августа 2010

Понял! Добавление в другой выбор сделал свое дело. Большое спасибо за помощь!

<xsl:for-each select="/marc:collection/marc:record/marc:datafield[@tag='099']">
    <xsl:element name="dc:identifier">`
        <xsl:if test="position()=1">
            <xsl:value-of select="marc:subfield[@code='a']/text()"/>
        </xsl:if>
    </xsl:element>
</xsl:for-each>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...