如何使用xslt缺少xml元素?

时间:2016-10-24 15:40:51

标签: xml xslt

我有三个xml结构需要通过创建一个元素(如果它缺失)或通过选择它(如果已经存在)来进行清理和均质化。

结构A包含我需要的大部分元素:

<biblStruct>
           <analytic>
              <title type="label">Gronemann/Maaß/Peters/Schrader 2001</title>
              <title type="titel">Körper und Schrift. Beiträge zum 16. Nachwuchskolloquium der
                 Romanistik, Leipzig, 14.-17. Juni 2000</title>
              <idno>6677</idno>
              <idno>6677</idno>
              <author>
                 <persName>Gronemann, Claudia;Maaß, Christiane;Peters, Sabine A.;Schrader,
                    Sabine</persName>
              </author>
           </analytic>
           <monogr>
              <title type="label">Gronemann/Maaß/Peters/Schrader 2001</title>
              <title type="titel">Körper und Schrift. Beiträge zum 16. Nachwuchskolloquium der
                 Romanistik, Leipzig, 14.-17. Juni 2000</title>
              <idno type="standortsign">UB Bern;SUB Göttingen</idno>
              <author>
                 <persName>Gronemann, Claudia;Maaß, Christiane;Peters, Sabine A.;Schrader,
                    Sabine</persName>
              </author>
              <imprint>
                 <publisher>Romanistischer Verlag</publisher>
                 <pubPlace>
                    <placeName>Bonn</placeName>
                 </pubPlace>
                 <date>2001</date>
              </imprint>
           </monogr>
           <relatedItem type="enhalt">
              <ref>Objekt 3257 / Biographien-Werke</ref>
           </relatedItem>
           <note type="faustdb">biogra</note>
           <note type="objektart">Bibliographie</note>
           <note type="objektart">Bibliographie</note>
           <note type="erstellt">
              <date>2016-09-18T00:00:00.000</date>
           </note>
           <note type="letztebearb">
              <date>2016-09-18T00:00:00.000</date>
           </note>
        </biblStruct>

而结构B缺少publisher内的元素imprint

<biblStruct>
           <analytic>
              <title type="label">Volmer 2001</title>
              <title type="titel">Die Gebrechen des Lebens. Zur Körpererfahrung in
                 Korrespondenzen des 18. Jahrhunderts</title>
              <idno>3257</idno>
              <idno>3257</idno>
              <author>
                 <persName>Volmer, Annett</persName>
              </author>
           </analytic>
           <monogr>
              <title type="label">Volmer 2001</title>
              <title type="titel">Die Gebrechen des Lebens. Zur Körpererfahrung in
                 Korrespondenzen des 18. Jahrhunderts</title>
              <idno type="standortsign">UB Basel: AP IX 5844</idno>
              <author>
                 <persName>Volmer, Annett</persName>
              </author>
              <imprint>
                 <biblScope unit="sammelwerkin">Objekt 6677 / Biographien-Werke</biblScope>
                 <biblScope unit="sammelwerkseiten">138-149</biblScope>
              </imprint>
           </monogr>
           <note type="faustdb">biogra</note>
           <note type="objektart">Bibliographie</note>
           <note type="objektart">Bibliographie</note>
           <note type="erstellt">
              <date>2005-01-19T00:00:00.000</date>
           </note>
           <note type="letztebearb">
              <date>2016-10-10T00:00:00.000</date>
           </note>
           <note type="kategorie">Briefkultur, Netzwerke,
              Transfer;Wissen(schaft)sgeschichte/Medizin</note>
        </biblStruct>

我希望能够创建嵌套在publisher内的imprint元素,当它只缺少时 - 我正在处理一个包含非常多样化条目的巨大列表。

同样适用于结构C,它缺少更多元素:

<biblStruct>
           <analytic>
              <idno>24587</idno>
              <idno>24587</idno>
              <author>
                 <persName>Person aus Ref-Tabelle</persName>
              </author>
           </analytic>
           <note type="faustdb">Publik</note>
           <note type="objektart">Rezensionen</note>
           <note type="objektart">Rezensionen</note>
        </biblStruct>

在这种情况下,我想在以下元素之后添加analytic

<monogr>
              <imprint>
                 <publisher></publisher>
              </imprint>
           </monogr>

所以输出应该是:

<biblStruct>
           <analytic>
              <idno>24587</idno>
              <idno>24587</idno>
              <author>
                 <persName>Person aus Ref-Tabelle</persName>
              </author>
           </analytic>
           <monogr>
              <imprint>
                 <publisher></publisher>
              </imprint>
           </monogr>
           <note type="faustdb">Publik</note>
           <note type="objektart">Rezensionen</note>
           <note type="objektart">Rezensionen</note>
        </biblStruct>

此时元素是否为空并不重要。知道我怎么能做到这一点?

请记住,所有这些xml条目都在同一个文件中,我无法对它们进行排序,因此我需要创建所需的元素,如果它们已经存在或者它们尚不存在则考虑在内。谢谢!

1 个答案:

答案 0 :(得分:0)

感谢您的评论。我尝试了这个,它适用于第一种情况:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs tei" version="2.0"
xmlns:tei="http://www.tei-c.org/ns/1.0">

<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="tei:imprint[not(./tei:publisher)]">
    <xsl:copy>
        <xsl:element name="tei:publisher"> </xsl:element>
    </xsl:copy>

</xsl:template>