1

これは非常に簡単な修正だと確信していますが、困惑しています。次のルート要素と繰り返しの子要素を持つ入力 XML があります。

<modsCollection 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.loc.gov/mods/v3"
    xsi:schemaLocation="
      http://www.loc.gov/mods/v3
      http://www.loc.gov/standards/mods/v3/mods-3-4.xsd">
  <mods version="3.4">
            ...

各ノードに一致する次の XSLT シートがあり、要素<mods>によって名前が付けられた別のファイルとしてそれを追い出します<identifier type="local">

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns="http://www.loc.gov/mods/v3">
  <xsl:output method="xml" indent="yes"/>   

  <xsl:template match="/modsCollection">
    <xsl:for-each select="mods">
      <xsl:variable name="filename" 
          select="concat(normalize-space(
                           identifier[@type='local']),
                         '.xml')" />
      <xsl:result-document href="{$filename}">            
        <xsl:copy-of select="."></xsl:copy-of>     
      </xsl:result-document>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

これ、XML 入力のルート要素に xmlns:xsi、xmlns、または xsi:schemaLoaction 属性がない場合に機能します。したがって、たとえば、次のように機能します。

<modsCollection>   
  <mods version="3.4">
            ...

一部の MODS ファイルにプレフィックスが含まれていることは知っていますが、XSLT マッチングでプレフィックスが検索されない場合、プレフィックスがないと機能しない理由がわかりません。ご意見やアドバイスをいただければ幸いです。

4

1 に答える 1

3
<xsl:template match="/modsCollection">

modsCollection名前空間に一致しません。あなたがしたい

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://www.loc.gov/mods/v3"
    xmlns:m="http://www.loc.gov/mods/v3">

それから

<xsl:template match="/m:modsCollection">

modsCollectionmods 名前空間で一致 させ、同様m:にスタイルシートのすべての xslt パターンと xpath 式でプレフィックスを使用します。

于 2013-03-06T19:57:28.033 に答える