0

一部のEAD(エンコードされたアーカイブの説明)XMLドキュメントでXSLT2.0ID変換を実行しています。出力を少し変更する必要がありますが、名前空間の問題が発生しているようです。

スキーマ対応プロセッサでこれをテストしないでください。エラーが発生します。:)

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="2.0">

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

<!-- The identity transform -->
<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="filedesc">
    <xsl:copy>
        <header>Subjects</header>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>    

サンプル-EAD.xml(ここのpastebinでも利用可能:http://pastebin.com/RFAQaY3w

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ead xsi:schemaLocation="urn:isbn:1-931666-22-9 http://www.loc.gov/ead/ead.xsd"     xmlns:ns2="http://www.w3.org/1999/xlink" xmlns="urn:isbn:1-931666-22-9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<eadheader findaidstatus="Ready_for_online" repositoryencoding="iso15511" countryencoding="iso3166-1" dateencoding="iso8601" langencoding="iso639-2b">  
<eadid>01234</eadid>
<filedesc>
    <AAA>1</AAA>
    <BBB>2</BBB>
</filedesc>
</eadheader>
<archdesc>
    <bib>
        <CCC>1</CCC>
        <DDD>2</DDD>
    </bib>
</archdesc>
 </ead>

要素から名前空間情報を引き出すと(http://pastebin.com/6ygi3xUmでも入手可能)、変更を加えたID変換が機能します。

サンプル-EAD-2:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ead>

<eadheader findaidstatus="Ready_for_online" repositoryencoding="iso15511" countryencoding="iso3166-1" dateencoding="iso8601" langencoding="iso639-2b">  
<eadid>01234</eadid>
<filedesc>
    <AAA>1</AAA>
    <BBB>2</BBB>
</filedesc>
</eadheader>
<archdesc>
    <bib>
        <CCC>1</CCC>
        <DDD>2</DDD>
    </bib>
</archdesc>

名前空間はあまり得意ではないので、アドバイスをいただければ幸いです。XSLTに名前空間を追加しようとすると、変換は機能しますが、新しい要素で名前空間属性を取得します。読んでくれてありがとう!乾杯!

編集:入力(名前空間付き)、ID変換結果の実行-

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ead xmlns:ns2="http://www.w3.org/1999/xlink" xmlns="urn:isbn:1-931666-22-9"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="urn:isbn:1-931666-22-9 http://www.loc.gov/ead/ead.xsd">

<eadheader findaidstatus="Ready_for_online" repositoryencoding="iso15511"
          countryencoding="iso3166-1"
          dateencoding="iso8601"
          langencoding="iso639-2b"> 
     <eadid>01234</eadid>
     <filedesc>
           <AAA>1</AAA>
           <BBB>2</BBB>
     </filedesc>
  </eadheader>
  <archdesc>
        <bib>
              <CCC>1</CCC>
              <DDD>2</DDD>
        </bib>
  </archdesc>
</ead>

入力(名前空間なし)はID変換結果を実行します-

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ead>

<eadheader findaidstatus="Ready_for_online" repositoryencoding="iso15511"
          countryencoding="iso3166-1"
          dateencoding="iso8601"
          langencoding="iso639-2b"> 
     <eadid>01234</eadid>
     <filedesc>
     <header>Subjects</header>
           <AAA>1</AAA>
           <BBB>2</BBB>
     </filedesc>
  </eadheader>
  <archdesc>
        <bib>
              <CCC>1</CCC>
              <DDD>2</DDD>
        </bib>
  </archdesc>

そして最後に、入力(名前空間付き)はXSLT(名前空間が追加された)の結果を実行します-

XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="2.0"
xsi:schemaLocation="urn:isbn:1-931666-22-9 http://www.loc.gov/ead/ead.xsd"
xmlns:ns2="http://www.w3.org/1999/xlink" 
xmlns="urn:isbn:1-931666-22-9"  
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

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

<!-- The identity transform -->
<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="filedesc">
    <xsl:copy>
        <header>Subjects</header>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>    

</xsl:stylesheet>

結果:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ead xmlns:ns2="http://www.w3.org/1999/xlink" xmlns="urn:isbn:1-931666-22-9"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="urn:isbn:1-931666-22-9 http://www.loc.gov/ead/ead.xsd">

<eadheader findaidstatus="Ready_for_online" repositoryencoding="iso15511"
          countryencoding="iso3166-1"
          dateencoding="iso8601"
          langencoding="iso639-2b"> 
     <eadid>01234</eadid>
     <filedesc>
           <AAA>1</AAA>
           <BBB>2</BBB>
     </filedesc>
  </eadheader>
  <archdesc>
        <bib>
              <CCC>1</CCC>
              <DDD>2</DDD>
        </bib>
  </archdesc>
</ead>

編集#2:申し訳ありませんが、希望する出力を表現できなかったと思います。ID変換後に追加の処理が行われるため、変更された要素に属性を追加することは避けたいと思います。また、XMLを現在の状態にできるだけ近づけたいと思います(編集を除く)。ご理解とご協力をよろしくお願いいたします。次に例を示します。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ead xsi:schemaLocation="urn:isbn:1-931666-22-9 http://www.loc.gov/ead/ead.xsd" xmlns:ns2="http://www.w3.org/1999/xlink" xmlns="urn:isbn:1-931666-22-9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<eadheader findaidstatus="Ready_for_online" repositoryencoding="iso15511" countryencoding="iso3166-1" dateencoding="iso8601" langencoding="iso639-2b">  
    <eadid>01234</eadid>
    <filedesc>
        <header>List Name</header>
        <AAA>1</AAA>
        <BBB>2</BBB>
    </filedesc>
</eadheader>
<archdesc>
    <bib>
        <CCC>1</CCC>
        <DDD>2</DDD>
    </bib>
</archdesc>
</ead>
4

1 に答える 1

0

それは非常に長い質問であり、従うのは少し難しいですが、これはあなたが望むものだと思います。一致させたい要素はソースxmlドキュメントの名前空間にあるため、名前空間も一致させる必要があります。したがって、xsltでプレフィックスを割り当てました。xmlns:input="urn:isbn:1-931666-22-9"次に、それを使用してfiledesc要素と一致させます<xsl:template match="input:filedesc">。また、同じ名前空間をxslのデフォルトの名前空間にして、要素がその名前空間に含まれるようにします。

<?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:input="urn:isbn:1-931666-22-9"
    xmlns="urn:isbn:1-931666-22-9"
    exclude-result-prefixes="input"
    version="2.0">

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

  <!-- The identity transform -->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="input:filedesc">
    <xsl:copy>
      <header>Subjects</header>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>  
</xsl:stylesheet>  
于 2012-04-17T21:23:51.277 に答える