将 XML 转换为 XML 但只显示部分元素
Transform XML to XML but only display some elements
我需要将一个 xml 文档中的元数据转换为另一个 xml 文档中的 Dublin Core 元数据。这是第一个 xml 文档:
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns:xlink="http://www.w3.org/1999/xlink">
<description>
<title>Letter from Waldemar Schultze to Jennie Schultze</title>
<creator type="author">
<name type="personal">Schultze, Waldemar</name>
</creator>
<date>1943-06-30</date>
<source>Special Collections and University Archives, W. E. B. Du Bois Library,
University of Massachusetts Amherst.</source>
<citation>Robert and Waldemar Schultze Papers (MS 528). Special Collections and
University Archives, W.E.B. Du Bois Library, University of
Massachusetts Amherst.</citation>
</description>
<text>
<header type="letterhead">
<imageGroup>
<image xlink:href="mums528-i001-001.png"/>
<caption>page 1</caption>
</imageGroup>
<imageGroup>
<image xlink:href="mums528-i001-002.png"/>
<caption>page 2</caption>
</imageGroup>
<organization>Unites States Disciplinary Barracks</organization>
<location>Fort Leavenworth, Kansas</location>
<date format="M/DD/YY">6/30/43</date>
<recipient>
<name type="personal">Mrs. W.J. Schultze</name>
<address>875 Richmond Av., Buffalo, N.Y.</address>
<relation>Mother</relation>
</recipient>
</header>
<body>
<salutation>Dear Mother,</salutation>
<p><line>This is the first letter I have had</line>
<line>an opportunity to write you since leaving Fort</line>
<line>Jay, and I know you must be anxious to hear from me.</line></p>
<p><line>Bob and I are both feeling as well as</line>
<line>can be expected considering our present cir-</line>
<line>cumstances. We both have high blood</line>
<line>pressure, mine has been 160/100 for the past</line>
<line>2 days, and Bob's 158/96, but my sinus</line>
<line>infection has not caused me quite so much</line>
<line>trouble since leaving N.Y. State. I believe</line>
<line>the air is dryer here and is responsible</line>
<line>for any alleviation that has taken place.</line></p>
<p><line>While a prisoner here remains in their</line>
<line>so-called 1st grade, he is able to write</line>
<line>twice a week, in second grade once a week,</line>
<line>and in third grade once a month. These</line>
<line>grades refer to classifications that ostensibly</line>
<line>are for conduct while here. It is quite possible</line>
<line>to lose a conduct rating, as I understand it,</line>
<line>by not having a perpetually rusting tin cup polished</line>
<pb n="2"/>
<line>brightly for daily inspection, although the tin plating long ago dis-</line>
<line>appeared and the cup is rusty again within 2 hours after wetting.</line></p>
<p><line>The food here is good and is well-cooked,</line>
<line>with one exception, the gravy, which is nothing but</line>
<line>flour, water, and bacon grease, Strangely enough, how-</line>
<line>ever, no condiments, not even salt, are provided on</line>
<line>the table, to the detriment of otherwise very good</line>
<line>meals. While meat here is unrationed and is plentiful,</line>
<line>toilet paper; believe it or not, is rationed. A</line>
<line>5¢ roll must last a prisoner 45 days, or else -- ?</line>
<line>Perhaps, however, a prisoner can purchase additional</line>
<line>if it should be necessary.</line></p>
<p><line>Please see that my subscriptions are transferred</line>
<line>here as soon as possible from Fort Jay. Give Florence</line>
<line>and Helen my regards, and thank Joe for his</line>
<line>efforts in my behalf in managing my business.</line>
<line>Find out from Joe how tube deliveries are at the</line>
<line>present time, first to satisfy my curiosity; and</line>
<line>also let me know if you are receiving your</line>
<line>remittance regularly from him. If he is not</line>
<line>taking care of your support in accordance with</line>
<line>the instructions I left him, I wish to know it,</line>
<line>so I can write, and correct the matter.</line>
<line>You can tell Joe to subscribe to Electronics</line>
<line>magazine for me and send it to this address</line>
<line>direct from the publisher. He should also have a copy</line>
<line>of Palmer's "Calculus for Home Study," sent me by the publisher,</line>
<line>whose name he can obtain from Ulbrichs. In future letters I'll</line>
<line>copy the "Prisoner's Handbook" issued here, and the</line>
<line>contents of the detached letter form stub.</line>
</p>
<valediction>Love, Waldemar</valediction>
</body>
</text>
因为我只需要在输出中表示一些元素 xml,我的 xsl 只使用了几个模板,其余的我留空了:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://relaxng.org/ns/structure/1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<dc><xsl:apply-templates select="document"></xsl:apply-templates></dc>
</xsl:template>
<xsl:template match="description/creator/name">
<creator><xsl:value-of select="."/></creator>
</xsl:template>
<xsl:template match="description/title">
<title><xsl:value-of select="."/></title>
</xsl:template>
<xsl:template match="description/date">
<date><xsl:value-of select="."/></date>
</xsl:template>
<xsl:template match="description/source">
<publisher><xsl:value-of select="."/></publisher>
</xsl:template>
<source></source>
<description></description>
<subject></subject>
<coverage></coverage>
<contributor></contributor>
<identifier></identifier>
<relation></relation>
<rights></rights>
<language></language>
<type></type>
<format></format>
文档通过验证,正确的元数据出现在输出的 Dublin Core 元素中。问题是,源 xml 的其余部分——我不需要——也出现在 <publisher>
元素之后。我怎样才能让所有其他文本从输出中消失?
这是因为内置模板处理的所有元素与您的任何自定义模板都不匹配。您可以添加以下模板以对当前 XSL 进行最少的更改来修复它:
<xsl:template match="*">
<xsl:apply-templates select="*"/>
</xsl:template>
供参考:Why does XSLT output all text by default?
或者简单地做:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://relaxng.org/ns/structure/1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/document">
<dc>
<creator><xsl:value-of select="description/creator/name"/></creator>
<title><xsl:value-of select="description/title"/></title>
<date><xsl:value-of select="description/date"/></date>
<publisher><xsl:value-of select="description/source"/></publisher>
<source/>
<description/>
<subject/>
<coverage/>
<contributor/>
<identifier/>
<relation/>
<rights/>
<language/>
<type/>
<format/>
</dc>
</xsl:template>
</xsl:stylesheet>
除了降低样式表的可读性之外,您的大量模板在这里毫无用处(这是假设每个描述元素只出现一次)。
请注意,空文字结果元素必须位于模板内才能出现在输出中。
我需要将一个 xml 文档中的元数据转换为另一个 xml 文档中的 Dublin Core 元数据。这是第一个 xml 文档:
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns:xlink="http://www.w3.org/1999/xlink">
<description>
<title>Letter from Waldemar Schultze to Jennie Schultze</title>
<creator type="author">
<name type="personal">Schultze, Waldemar</name>
</creator>
<date>1943-06-30</date>
<source>Special Collections and University Archives, W. E. B. Du Bois Library,
University of Massachusetts Amherst.</source>
<citation>Robert and Waldemar Schultze Papers (MS 528). Special Collections and
University Archives, W.E.B. Du Bois Library, University of
Massachusetts Amherst.</citation>
</description>
<text>
<header type="letterhead">
<imageGroup>
<image xlink:href="mums528-i001-001.png"/>
<caption>page 1</caption>
</imageGroup>
<imageGroup>
<image xlink:href="mums528-i001-002.png"/>
<caption>page 2</caption>
</imageGroup>
<organization>Unites States Disciplinary Barracks</organization>
<location>Fort Leavenworth, Kansas</location>
<date format="M/DD/YY">6/30/43</date>
<recipient>
<name type="personal">Mrs. W.J. Schultze</name>
<address>875 Richmond Av., Buffalo, N.Y.</address>
<relation>Mother</relation>
</recipient>
</header>
<body>
<salutation>Dear Mother,</salutation>
<p><line>This is the first letter I have had</line>
<line>an opportunity to write you since leaving Fort</line>
<line>Jay, and I know you must be anxious to hear from me.</line></p>
<p><line>Bob and I are both feeling as well as</line>
<line>can be expected considering our present cir-</line>
<line>cumstances. We both have high blood</line>
<line>pressure, mine has been 160/100 for the past</line>
<line>2 days, and Bob's 158/96, but my sinus</line>
<line>infection has not caused me quite so much</line>
<line>trouble since leaving N.Y. State. I believe</line>
<line>the air is dryer here and is responsible</line>
<line>for any alleviation that has taken place.</line></p>
<p><line>While a prisoner here remains in their</line>
<line>so-called 1st grade, he is able to write</line>
<line>twice a week, in second grade once a week,</line>
<line>and in third grade once a month. These</line>
<line>grades refer to classifications that ostensibly</line>
<line>are for conduct while here. It is quite possible</line>
<line>to lose a conduct rating, as I understand it,</line>
<line>by not having a perpetually rusting tin cup polished</line>
<pb n="2"/>
<line>brightly for daily inspection, although the tin plating long ago dis-</line>
<line>appeared and the cup is rusty again within 2 hours after wetting.</line></p>
<p><line>The food here is good and is well-cooked,</line>
<line>with one exception, the gravy, which is nothing but</line>
<line>flour, water, and bacon grease, Strangely enough, how-</line>
<line>ever, no condiments, not even salt, are provided on</line>
<line>the table, to the detriment of otherwise very good</line>
<line>meals. While meat here is unrationed and is plentiful,</line>
<line>toilet paper; believe it or not, is rationed. A</line>
<line>5¢ roll must last a prisoner 45 days, or else -- ?</line>
<line>Perhaps, however, a prisoner can purchase additional</line>
<line>if it should be necessary.</line></p>
<p><line>Please see that my subscriptions are transferred</line>
<line>here as soon as possible from Fort Jay. Give Florence</line>
<line>and Helen my regards, and thank Joe for his</line>
<line>efforts in my behalf in managing my business.</line>
<line>Find out from Joe how tube deliveries are at the</line>
<line>present time, first to satisfy my curiosity; and</line>
<line>also let me know if you are receiving your</line>
<line>remittance regularly from him. If he is not</line>
<line>taking care of your support in accordance with</line>
<line>the instructions I left him, I wish to know it,</line>
<line>so I can write, and correct the matter.</line>
<line>You can tell Joe to subscribe to Electronics</line>
<line>magazine for me and send it to this address</line>
<line>direct from the publisher. He should also have a copy</line>
<line>of Palmer's "Calculus for Home Study," sent me by the publisher,</line>
<line>whose name he can obtain from Ulbrichs. In future letters I'll</line>
<line>copy the "Prisoner's Handbook" issued here, and the</line>
<line>contents of the detached letter form stub.</line>
</p>
<valediction>Love, Waldemar</valediction>
</body>
</text>
因为我只需要在输出中表示一些元素 xml,我的 xsl 只使用了几个模板,其余的我留空了:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://relaxng.org/ns/structure/1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<dc><xsl:apply-templates select="document"></xsl:apply-templates></dc>
</xsl:template>
<xsl:template match="description/creator/name">
<creator><xsl:value-of select="."/></creator>
</xsl:template>
<xsl:template match="description/title">
<title><xsl:value-of select="."/></title>
</xsl:template>
<xsl:template match="description/date">
<date><xsl:value-of select="."/></date>
</xsl:template>
<xsl:template match="description/source">
<publisher><xsl:value-of select="."/></publisher>
</xsl:template>
<source></source>
<description></description>
<subject></subject>
<coverage></coverage>
<contributor></contributor>
<identifier></identifier>
<relation></relation>
<rights></rights>
<language></language>
<type></type>
<format></format>
文档通过验证,正确的元数据出现在输出的 Dublin Core 元素中。问题是,源 xml 的其余部分——我不需要——也出现在 <publisher>
元素之后。我怎样才能让所有其他文本从输出中消失?
这是因为内置模板处理的所有元素与您的任何自定义模板都不匹配。您可以添加以下模板以对当前 XSL 进行最少的更改来修复它:
<xsl:template match="*">
<xsl:apply-templates select="*"/>
</xsl:template>
供参考:Why does XSLT output all text by default?
或者简单地做:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://relaxng.org/ns/structure/1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/document">
<dc>
<creator><xsl:value-of select="description/creator/name"/></creator>
<title><xsl:value-of select="description/title"/></title>
<date><xsl:value-of select="description/date"/></date>
<publisher><xsl:value-of select="description/source"/></publisher>
<source/>
<description/>
<subject/>
<coverage/>
<contributor/>
<identifier/>
<relation/>
<rights/>
<language/>
<type/>
<format/>
</dc>
</xsl:template>
</xsl:stylesheet>
除了降低样式表的可读性之外,您的大量模板在这里毫无用处(这是假设每个描述元素只出现一次)。
请注意,空文字结果元素必须位于模板内才能出现在输出中。