XMLでXSLT変換を使用して、一部のメタデータ(MODSをDublin Core DCに変換する)に取り組んでいます。XSLTトランスフォームは、アイランドオーラのテキストコンテンツのないノード(その属性)にアクセスしません。MODSからDCへの変換
XMLは次のようになります。
<?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>
あなたが見ることができるように、それはこのようになります変換する
<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その中にテキストコンテンツのない要素(空要素)はXSLTによって読み取られません。 3番目の要素には最初の内容が含まれていません。[@lang='hrv']
mads:topic
、出力には入りませんが、出力には[@valueURI]
が必要です。 4番目の要素に2番目のコンテンツがありません[@lang='eng']
mads:topic
、出力には入りません。
テキストコンテンツが含まれていない場合でも、その属性が存在する場合は、dc:subject
という要素のDCにその属性の[@valueURI]
を取得する必要があります。 トランスフォーメーションがそれらのノードにアクセスするかどうかをテストするのは問題ありませんが、明らかにそうではありません。
<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>
が、なぜこの1つが欠落しています。
だから基本的に私はこのようないくつかの出力が必要ですか?
<dc:subject xml:lang="hrv">http://www.ncbi.nlm.nih.gov/mesh/D001208</dc:subject>
質問には、問題が発生している正確なXMLが表示されていますか?あなたのXSLTは 'mods'名前空間内のルート要素を探していますが、これはあなたのXMLにはありません。 –
まあ、rootとしてmods:modsがあり、拡張のためのnamespaceもmodsです。 XMLは問題のある部分に縮小され、XSLTは完全で完全です。 – Gem
このXSLTは通常の兄弟にアクセスしてOKを出力するので、XMLの他の部分には問題はないと思います。問題は、テキストコンテンツを持たないこの兄弟にアクセスすることです – Gem