Это, должно быть, очень простой вопрос, но я действительно борюсь с решением.Из следующего XML я пытаюсь извлечь только первый экземпляр, когда у меня есть совпадение атрибутов tag="099" и code="a" в узле marc:datafield и узле marc:subfield соответственно
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, но ... Любые ссылки будут оценены.
Спасибо
Используйте
/marc:collection/marc:record/marc:datafield [@tag='099']/marc:subfield[@code='a'][1]/text()
Измените
<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'
@code
'a'
@code='a'
Понял! Добавление в другой выбор сделал свое дело. Большое спасибо за помощь!
<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>