-1

我在 Islandora (Drupal) 工作以转换一些元数据(MODS 到 Dublin Core DC)并在 XML 上使用 XSLT 转换。

XML 如下所示:

<mods:mods>
    <mods:extension>
        <mads:madsCollection>
            <mads:mads>
                ...
                <mads:topic lang="hrv" valueURI="http://www.ncbi.nlm.nih.gov/mesh/D000349">Afrika</mads:topic>
                <mads:topic lang="eng">Africa</mads:topic>
                ...
            </mads:mads>
            <mads:mads>
                ...
                <mads:topic lang="hrv" valueURI="http://www.ncbi.nlm.nih.gov/mesh/D005060">Europa</mads:topic>
                <mads:topic lang="eng">Europe</mads:topic>
                ...
            </mads:mads>
            <mads:mads>
                ...
                <mads:topic lang="hrv" valueURI="http://www.ncbi.nlm.nih.gov/mesh/D001208" />
                <mads:topic lang="eng">Asia</mads:topic>
                ...
            </mads:mads>
            <mads:mads>
                ...
            <mads:topic lang="hrv" valueURI="http://www.ncbi.nlm.nih.gov/mesh/D001315">Australia</mads:topic>
            <mads:topic lang="eng"/>
                ...
            </mads:mads>
        </mads:madsCollection>
    </mods:extension>
</mods:mods>

和 XSLT 转换它看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:mods="http://www.loc.gov/mods/v3" exclude-result-prefixes="mods"
                xmlns:dc="http://purl.org/dc/elements/1.1/"
                xmlns:mads="http://www.loc.gov/mads/v2"
                xmlns:srw_dc="info:srw/schema/1/dc-schema"
                xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="no"/>

    <xsl:template match="/">
        <!-- WS: updated schema location -->
        <xsl:for-each select="mods:mods">
            <oai_dc:dc xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd">
                <xsl:apply-templates/>
            </oai_dc:dc>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="/mods:mods/mods:extension/mads:madsCollection">
        <xsl:apply-templates select="mads:mads/mads:topic" />
    </xsl:template>

    <xsl:template match="mads:mads/mads:topic">
        <dc:subject>
            <xsl:attribute name="xml:lang">
                <xsl:value-of select="@lang" />
            </xsl:attribute>
            <xsl:value-of select="@valueURI" />
        </dc:subject>
    </xsl:template> 

</xsl:stylesheet>

输出是这样的:

<oai_dc:dc xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd">
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D000349</dc:subject>
    <dc:subject xml:lang="eng"/>
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D005060</dc:subject>
    <dc:subject xml:lang="eng"/>
    <dc:subject xml:lang="eng"/>
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D001315</dc:subject>
</oai_dc:dc>

如您所见,XSLT 不会读取其中没有任何文本内容的元素(空元素)。第三个元素在第一个中没有内容[@lang='hrv'] mads:topic,也没有进入输出,但我需要[@valueURI]在输出中使用它。第四个元素在 second 中没有内容[@lang='eng'] mads:topic,也不会进入输出。

即使其中没​​有任何文本内容,如果该属性存在,我也需要将它们的属性作为文本获取[@valueURI]到元素中的 DC 。dc:subject测试转换是否访问这些节点不是问题,但显然没有。

所以基本上我需要一些这样的输出:

<oai_dc:dc xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd">
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D000349</dc:subject>
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D005060</dc:subject>
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D001208</dc:subject>
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D001315</dc:subject>
</oai_dc:dc>

这个怎么不见了?

<dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D001208</dc:subject>
4

1 回答 1

0

好吧,我用你的 XML 测试了你的 XSLT,结果还不错。但是,为了完善结果,需要进行一项修改:

要仅选择包含valueURI属性的元素,必须添加谓词。

<xsl:template match="/mods:mods/mods:extension/mads:madsCollection">
    <xsl:apply-templates select="mads:mads/mads:topic[@valueURI]" />
</xsl:template>

应用此修改后的结果是:

<?xml version="1.0" encoding="UTF-8"?><oai_dc:dc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:mads="http://www.loc.gov/mads/v2" xmlns:srw_dc="info:srw/schema/1/dc-schema" xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd">

    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D000349 </dc:subject>
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D005060 </dc:subject>
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D001208 </dc:subject>
    <dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D001315 </dc:subject>
</oai_dc:dc>

PS:我只是将您的输入 XML 放入 XSLT 处理器中。输出如您所愿。输出中没有缺少元素!

于 2016-04-12T09:22:42.393 回答