首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用marc默认命名空间的XSLT输出格式化

使用marc默认命名空间的XSLT输出格式化
EN

Stack Overflow用户
提问于 2022-11-09 16:32:46
回答 2查看 26关注 0票数 0

这只是个小化妆品,我只是好奇水下到底发生了什么。我正在使用MARC21 transform.exe将XML转换为其他XML方言文本。

这是我输出的一个简短的样本。问题是:为什么OCLC_number在一个单独的行上都有标记和内容(后面的结束标记是选项卡),而其他所有的标签和内容都在一行上?后者在我看来更好,但我知道这只是表面的东西。

代码语言:javascript
运行
复制
    <?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的出口要大得多。

代码语言:javascript
运行
复制
    <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的一个简短版本。

代码语言:javascript
运行
复制
    <?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本身是完整的文档,但是我没有找到任何关于这个特定名称空间应该做什么或定义什么的文档。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-09 16:41:38

您需要选择子字段select="translate(marc:datafield[@tag=034]/marc:subfield"或使用<xsl:strip-space elements="*"/>

票数 1
EN

Stack Overflow用户

发布于 2022-11-09 21:55:35

您正在复制元素的字符串值

代码语言:javascript
运行
复制
    <datafield tag="034" ind1=" " ind2=" ">
        <subfield code="a">(OCoLC)776125014</subfield>
    </datafield>

元素的字符串值是其所有子代文本节点的连接,并且没有从输入中去掉空白,因此这是<subfield>之前的所有空格,后面是"(OCoLC)776125014",然后是在<subfield>之后的所有空格(第二个空格比第一个空格略短,因此输出出现混乱)。序列化程序(带有indent="yes")有一定的自由度来调整输出中的空白,但不是显式写入结果树的元素的实际内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74378330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档