这只是个小化妆品,我只是好奇水下到底发生了什么。我正在使用MARC21 transform.exe将XML转换为其他XML方言文本。
这是我输出的一个简短的样本。问题是:为什么OCLC_number在一个单独的行上都有标记和内容(后面的结束标记是选项卡),而其他所有的标签和内容都在一行上?后者在我看来更好,但我知道这只是表面的东西。
<?xml version="1.0" encoding="UTF-8"?>
<AdlibXML xmlns:marc="http://www.loc.gov/MARC21/slim">
<record>
<OCLC_number>
776125014
</OCLC_number>
<author>Lippmann, Harry.</author>
<title>Deutsches Atlantik Wall Archiv : Register ... / Harry Lippmann.</title>
<place_of_publication>Köln :</place_of_publication>
</record>
</AdlibXML>下面是一个示例输入XML。在现实生活中,WorldCat的出口要大得多。
<collection>
<record xmlns="http://www.loc.gov/MARC21/slim">
<datafield tag="034" ind1=" " ind2=" ">
<subfield code="a">(OCoLC)776125014</subfield>
</datafield>
<datafield tag="100" ind1="1" ind2=" ">
<subfield code="a">Lippmann, Harry.</subfield>
</datafield>
<datafield tag="245" ind1="1" ind2="0">
<subfield code="a">Deutsches Atlantik Wall Archiv :</subfield>
<subfield code="b">Register ... /</subfield>
<subfield code="c">Harry Lippmann.</subfield>
</datafield>
<datafield tag="260" ind1=" " ind2=" ">
<subfield code="a">Köln :</subfield>
<subfield code="b">Lippmann,</subfield>
<subfield code="c">1996-....</subfield>
</datafield>
</record>
</collection>下面是我的XSLT的一个简短版本。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:marc="http://www.loc.gov/MARC21/slim"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="collection">
<AdlibXML>
<xsl:apply-templates select="marc:record" />
</AdlibXML>
</xsl:template>
<xsl:template match="marc:record">
<!-- OCLC-number must not be empty -->
<xsl:if test="marc:datafield[@tag=034] !=''" >
<record>
<OCLC_number>
<xsl:value-of select="translate(marc:datafield[@tag=034], '(OCoLC)', '')" />
</OCLC_number>
<author>
<xsl:value-of select="marc:datafield[@tag=100]/marc:subfield[@code='a']" />
</author>
<title>
<xsl:value-of select="marc:datafield[@tag=245]/marc:subfield[@code='a']" />
<xsl:if test="marc:datafield[@tag=245]/marc:subfield[@code='b'] != ''" >
<xsl:text> </xsl:text>
<xsl:value-of select="marc:datafield[@tag=245]/marc:subfield[@code='b']" />
</xsl:if>
<xsl:if test="marc:datafield[@tag=245]/marc:subfield[@code='c'] !=''" >
<xsl:text> </xsl:text>
<xsl:value-of select="marc:datafield[@tag=245]/marc:subfield[@code='c']" />
</xsl:if>
</title>
<place_of_publication>
<xsl:value-of select="marc:datafield[@tag=260]/marc:subfield[@code='a']" />
</place_of_publication>
</record>
</xsl:if>
</xsl:template>
</xsl:stylesheet> XSLT可以工作。在创建名称空间的过程中,我了解了默认名称空间。事实上,我了解到我必须使用xmlns:marc="http://www.loc.gov/MARC21/slim"。但是,虽然MARC21本身是完整的文档,但是我没有找到任何关于这个特定名称空间应该做什么或定义什么的文档。
发布于 2022-11-09 16:41:38
您需要选择子字段select="translate(marc:datafield[@tag=034]/marc:subfield"或使用<xsl:strip-space elements="*"/>。
发布于 2022-11-09 21:55:35
您正在复制元素的字符串值
<datafield tag="034" ind1=" " ind2=" ">
<subfield code="a">(OCoLC)776125014</subfield>
</datafield>元素的字符串值是其所有子代文本节点的连接,并且没有从输入中去掉空白,因此这是<subfield>之前的所有空格,后面是"(OCoLC)776125014",然后是在<subfield>之后的所有空格(第二个空格比第一个空格略短,因此输出出现混乱)。序列化程序(带有indent="yes")有一定的自由度来调整输出中的空白,但不是显式写入结果树的元素的实际内容。
https://stackoverflow.com/questions/74378330
复制相似问题