将 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>

除了降低样式表的可读性之外,您的大量模板在这里毫无用处(这是假设每个描述元素只出现一次)。

请注意,空文字结果元素必须位于模板内才能出现在输出中。