如何使用XSLT创建新的祖先元素并更改其他元素的顺序?

时间:2016-10-21 07:21:18

标签: xml xslt

我有一个需要使用XSLT修改的biblStruct列表。输入如下所示:

 <biblStruct>
           <title type="label">Volmer 2001</title>
           <author>
              <persName>Volmer, Annett</persName>
           </author>
           <title type="titel">Die Gebrechen des Lebens. Zur Körpererfahrung in
        Korrespondenzen des 18. Jahrhunderts</title>
           <note type="faustdb">biogra</note>
           <idno>3257</idno>
           <note type="objektart">Bibliographie</note>
           <idno>3257</idno>
           <note type="objektart">Bibliographie</note>
           <title type="label">Volmer 2001</title>
           <author>
              <persName>Volmer, Annett</persName>
           </author>
           <title type="titel">Die Gebrechen des Lebens. Zur Körpererfahrung in
        Korrespondenzen des 18. Jahrhunderts</title>
           <biblScope unit="sammelwerkin">Objekt 6677 / Biographien-Werke</biblScope>
           <biblScope unit="sammelwerkseiten">138-149</biblScope>
           <idno type="standortsign">UB Basel: AP IX 5844</idno>
           <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>

我需要:

  • 创建一个元素analytic,用于将元素从title type="label"分组到note type="objektart">;
  • 创建一个元素monogr,该元素从第二个title type="label"idno type="standortsign"分组;
  • 创建嵌套在imprint内的元素monogr - 此新元素应包含新元素publisher和现有元素biblScope;
  • 将所有备注移至最后analyticmonogr之外。

输出应如下所示:

 <biblStruct xml:id="volmer_2001">

           <analytic>
              <author>
                 <persName>Volmer, Annett</persName>
              </author>
              <title type="titel">Die Gebrechen des Lebens. Zur Körpererfahrung in
                 Korrespondenzen des 18. Jahrhunderts</title>
              <idno>3257</idno>
           </analytic>

           <monogr>
              <author>
                 <persName>Volmer, Annett</persName>
              </author>
              <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>
              <idno>3257</idno>
              <imprint>
                 <publisher></publisher>
                 <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="kategorie">Briefkultur, Netzwerke, Transfer;
              Wissen(schaft)sgeschichte/Medizin</note>
           <note type="erstellt">
              <date>2005-01-19</date>
           </note>
           <note type="letztebearb">
              <date>2016-10-10</date>
           </note>

        </biblStruct>

1 个答案:

答案 0 :(得分:0)

在使用XSLT 2.0时,可以使用xsl:for-each-group构造。您可以按biblStruct

的起始元素对note的所有子元素(title除外)进行分组
<xsl:for-each-group select="* except note" group-starting-with="title[@type='label']">

然后,在此范围内,您可以测试位置以确定是创建analytic元素还是monogr元素。

  <xsl:choose>
    <xsl:when test="position() = 1">
      <analytic>
        <xsl:apply-templates select="current-group()" />
      </analytic>
    </xsl:when>
    <xsl:otherwise>
      <monogr>
         ...

对于monogr元素,您可以使用额外的逻辑来创建imprint元素,并添加publisher和现有的biblScope元素。

  <monogr>
     <xsl:apply-templates select="current-group() except biblScope" />
     <imprint>
        <publisher />
        <xsl:apply-templates select="biblScope" />
     </imprint>
   </monogr>

试试这个XSLT(其中还包括在末尾添加所有note元素):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml" indent="yes" />

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

  <xsl:template match="biblStruct">
    <xsl:copy>
      <xsl:for-each-group select="* except note" group-starting-with="title[@type='label']">
        <xsl:choose>
          <xsl:when test="position() = 1">
            <analytic>
              <xsl:apply-templates select="current-group()" />
            </analytic>
          </xsl:when>
          <xsl:otherwise>
            <monogr>
                <xsl:apply-templates select="current-group() except biblScope" />
              <imprint>
                <publisher />
                <xsl:apply-templates select="biblScope" />
              </imprint>
            </monogr>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each-group>
      <xsl:apply-templates select="note" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>