4

MARC-xml レコードを FGDC-xml メタデータに変換する xslt スタイルシートを作成しています。多くの MARC フィールドの末尾に不要な句読点 (ピリオド、コロン、コンマなど) があり、これを取り除きたいと考えています。ただし、行からすべての句読点を削除したくはありません。私の考えでは、 ifステートメントを使用してテンプレートを作成し、フィールドが指定された文字で終わるかどうかをテストしてから削除することですが、1) これが良いアプローチかどうか、2) そのプロセスを指定する方法はわかりません。

私のxsltを編集しました:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:marc="http://www.loc.gov/MARC21/slim" >
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
<xsl:for-each select="marc:collection/marc:record">
  <xsl:result-document method="xml" href="banana_{marc:controlfield[@tag=001]}.xml">
    <metadata>
      <xsl:apply-templates select="self::marc:record"/>
    </metadata>
  </xsl:result-document>
</xsl:for-each>
</xsl:template>

<xsl:template match="marc:record">
  <pubinfo>
    <pubplace><xsl:value-of select="marc:datafield[@tag=260]/marc:subfield[@code='a']"/></pubplace>
    <publish><xsl:value-of select="marc:datafield[@tag=260]/marc:subfield[@code='b']" /></publish>
  </pubinfo>
</xsl:template>

</xsl:stylesheet>

そして、ここに私のxmlドキュメント(または少なくともその代表的な部分)があります:

<?xml version="1.0" encoding="UTF-8"?>
<marc:collection xmlns:marc="http://www.loc.gov/MARC21/slim" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd">
<marc:record>
    <marc:leader>01502cfm a2200313 a 4500</marc:leader>
    <marc:controlfield tag="001">7943586</marc:controlfield>
    <marc:datafield tag="260" ind1=" " ind2=" ">
        <marc:subfield code="a">[S.l. :</marc:subfield>
        <marc:subfield code="b">s.n. ,</marc:subfield>
        <marc:subfield code="c">18--]</marc:subfield>
    </marc:datafield>
</marc:record>
<marc:record>
    <marc:leader>01290cem a2200313 a 4500</marc:leader>
    <marc:controlfield tag="001">8108664</marc:controlfield>
    <marc:datafield tag="260" ind1=" " ind2=" ">
        <marc:subfield code="a">Torino :</marc:subfield>
        <marc:subfield code="b">Editore Gio. Batt. Maggi ,</marc:subfield>
        <marc:subfield code="c">1863.</marc:subfield>
    </marc:datafield>
</marc:record>
</marc:collection>
4

2 に答える 2

4

ends-with()正規表現ではなく、単純な文字列を受け入れます。そのため、次のような問題が発生しています。

ends-with(marc:datafield[@tag=260]/marc:subfield[@code='b'],'.|:|,')

正規表現を使用する場合は、次を使用しますmatches()

marc:datafield[@tag=260]/marc:subfield[@code='b']/matches(.,'^.*[\.:,]$')

そして使用を削除するにはreplace()

replace('Ends with punctuation.', '^(.*)[\.:,]$', '$1')
=>
Ends with punctuation

また、最初に if でテストするのではなく、すべてのノードで置換を実行する方がおそらく簡単です。一致しない場合は置換を行わないためです。

于 2012-11-13T20:59:16.067 に答える
2

すべての終了句読点が何であるかを事前に知る必要がない、一般的な解決策が存在します

<xsl:stylesheet version="2.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

 <xsl:template match="text()[matches(., '^.*\p{P}$')]">
  <xsl:sequence select="replace(., '(^.*)\p{P}$', '$1')"/>
 </xsl:template>
</xsl:stylesheet>

この変換がこの XML ドキュメントに適用されると、次のようになります

<x>
    <t>Some text .</t>
    <t>Some text2 ;</t>
    <t>Some text3 (</t>
    <t>Some text4 !</t>
    <t>Some text5 "</t>
</x>

必要な正しい結果が生成されます。

<x>
      <t>Some text </t>
      <t>Some text2 </t>
      <t>Some text3 </t>
      <t>Some text4 </t>
      <t>Some text5 </t>
</x>

説明:

p{P}文字クラス/カテゴリの適切な使用。

\p句読点カテゴリのエスケープです。Pすべての句読点プロパティです。

更新

OP は、特定のソース XML ドキュメントとその変換コードを提供しています。

上記のソリューションで変更された彼女のコードは次のとおりです。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:marc="http://www.loc.gov/MARC21/slim" >
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
<xsl:for-each select="marc:collection/marc:record">
  <xsl:result-document method="xml" href="banana_{marc:controlfield[@tag=001]}.xml">
    <metadata>
      <xsl:apply-templates select="self::marc:record"/>
    </metadata>
  </xsl:result-document>
</xsl:for-each>
</xsl:template>

<xsl:template match="marc:record">
  <pubinfo>
    <xsl:variable name="vSub1" select="marc:datafield[@tag=260]/marc:subfield[@code='a']"/>
    <xsl:variable name="vSub2" select="marc:datafield[@tag=260]/marc:subfield[@code='b']"/>
    <pubplace><xsl:value-of select="replace($vSub1, '(^.*)\s\p{P}$', '$1')"/></pubplace>
    <publish><xsl:value-of select="replace($vSub2, '(^.*)\s\p{P}$', '$1')" /></publish>
  </pubinfo>
</xsl:template>

</xsl:stylesheet>
于 2012-11-14T02:52:15.787 に答える