這是一個小化妝品,我只是好奇水下發生了什么。我正在使用 Saxonica 將 MARC21 XML 轉換為其他 XML dialext transform.exe。
這是我的輸出的簡短示例。問題是:為什么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>Ko?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">Ko?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 本身有完整的檔案,但我找不到任何關于這個特定命名空間應該做什么或定義的檔案。
uj5u.com熱心網友回復:
您需要選擇子欄位select="translate(marc:datafield[@tag=034]/marc:subfield"或使用<xsl:strip-space elements="*"/>.
uj5u.com熱心網友回復:
您正在復制元素的字串值
<datafield tag="034" ind1=" " ind2=" ">
<subfield code="a">(OCoLC)776125014</subfield>
</datafield>
元素的字串值是其所有后代文本節點的串聯,并且您沒有從輸入中去除空格,因此這是 之前的所有空格<subfield>,然后是“(OCoLC)776125014”,然后是所有空格之后<subfield>(第二個空格比第一個短一點,因此輸出中的鋸齒狀)。序列化程式(帶有 indent="yes")有一定的自由度來調整輸出中的空白,但不是在它是顯式寫入結果樹的元素的實際內容的地方。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/531614.html
標籤:xmlxslt
上一篇:訪問嵌套的XML-向上
