我在 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>