Во-первых, у вас проблема с выражением соответствия, должно быть это ...
/foxml:digitalObject/foxml:datastream/foxml:datastreamVersion[@ID eq 'DC.1']/foxml:xmlContent
Вы пропустили foxml:datastream
в пути.Также «DC.1» нужно было поставить в апострофах, чтобы сделать его строкой, в отличие от имени элемента.
Однако, в ответ на ваш вопрос «почему он выбирает материал из узла, который не 'не соответствует атрибуту ", ответ" Из-за встроенных шаблонов XSLT"
Когда XSLT начинает свою обработку, он будет искать шаблон, соответствующий узлу документа /
.У вас нет такого шаблона в вашем XSLT, и поэтому шаблон по умолчанию включается. По сути, это эквивалентно наличию этих двух шаблонов в вашем XSLT
<xsl:template match="*|/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="text()|@*">
<xsl:value-of select="."/>
</xsl:template>
Они пропускают элементы, но выводят текст там, где находятэто, что приводит к выводу всего другого текста.Чтобы прекратить это, добавьте этот шаблон к вашему XSLT
<xsl:template match="node()">
<xsl:apply-templates />
</xsl:template>
(В XSLT 3.0 вместо этого введите <xsl:mode on-no-match="shallow-skip" />
)
Что касается второго вопроса, когда шаблон соответствует, вы делаете<xsl:value-of select="oai_dc:dc"/>
и выводит все нисходящие текстовые узлы.Вместо этого следует использовать xsl:copy-of
.
Попробуйте это XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:audit="info:fedora/fedora-system:def/audit#" xmlns:premis="http://www.loc.gov/standards/premis/v1"
exclude-result-prefixes="xs dc oai_dc audit premis foxml xsi"
version="2"
xmlns:foxml="info:fedora/fedora-system:def/foxml#"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="info:fedora/fedora-system:def/foxml# http://www.fedora.info/definitions/1/0/foxml1-1.xsd">
<xsl:output method="xml" indent="yes" name="xml"/>
<xsl:template match="node()">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="/foxml:digitalObject/foxml:datastream/foxml:datastreamVersion[@ID eq 'DC.1']/foxml:xmlContent">
<metadata>
<xsl:copy-of select="oai_dc:dc"/>
</metadata>
</xsl:template>
</xsl:stylesheet>
В качестве альтернативы, просто сопоставьте узел документа и выберите целевой объект, который вы хотите скопировать, с помощью выбора.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:audit="info:fedora/fedora-system:def/audit#" xmlns:premis="http://www.loc.gov/standards/premis/v1"
exclude-result-prefixes="xs dc oai_dc audit premis foxml xsi"
version="2"
xmlns:foxml="info:fedora/fedora-system:def/foxml#"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="info:fedora/fedora-system:def/foxml# http://www.fedora.info/definitions/1/0/foxml1-1.xsd">
<xsl:output method="xml" indent="yes" name="xml"/>
<xsl:template match="/">
<xsl:apply-templates select="foxml:digitalObject/foxml:datastream/foxml:datastreamVersion[@ID eq 'DC.1']/foxml:xmlContent" />
</xsl:template>
<xsl:template match="foxml:xmlContent">
<metadata>
<xsl:copy-of select="oai_dc:dc"/>
</metadata>
</xsl:template>
</xsl:stylesheet>