2016-04-12 6 views
-1

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> 
+1

質問には、問題が発生している正確なXMLが表示されていますか?あなたのXSLTは 'mods'名前空間内のルート要素を探していますが、これはあなたのXMLにはありません。 –

+0

まあ、rootとしてmods:modsがあり、拡張のためのnamespaceもmodsです。 XMLは問題のある部分に縮小され、XSLTは完全で完全です。 – Gem

+0

このXSLTは通常の兄弟にアクセスしてOKを出力するので、XMLの他の部分には問題はないと思います。問題は、テキストコンテンツを持たないこの兄弟にアクセスすることです – Gem

答えて

0

あなたのXMLであなたのXSLTをテストしたところ、結果はかなり良かったです。ただし、結果を完成させるには、1つの修正が必要でした。

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> 

P.S:私はちょうどXSLTプロセッサにあなたの入力XMLを置きます。出力はあなたが望む通りでした。出力に欠けている要素はありませんでした!

+0

私は、変態前にアイランドがそれらのモジュールの1つでこれらの要素を殺したと思われますが、正確にはわからない – Gem

+0

私はそれを読んですみません。私はそれを適用している 'Islandora'またはその機関や組織を知らない。私の答えは、あなたの入力XMLが標準準拠のXSLTプロセッサ(私の場合はSaxonB)によって正しく処理されていることを確認するだけです。もしあなたのXSLTプロセッサ_が別の結果を出せば、バクシーなのかもしれません。なぜなら、サクソンはかなり標準ですから。 – zx485

関連する問題