XSLT - 如何编辑多个子元素

XSLT - how to edit multiple child elements

我想编辑一个子元素值 (cit:title) 并添加另一个元素 (mdb:defaultLocale)。这是我的 xml:

<?xml version="1.0" encoding="UTF-8"?>
<mdb:MD_Metadata xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0"
    xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0"
    xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0"
    xmlns:mcc="http://standards.iso.org/iso/19115/-3/mcc/1.0"  
    xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0">
    <mdb:metadataIdentifier>
        <mcc:MD_Identifier>
            <mcc:authority>
                <cit:CI_Citation>
                    <cit:title>
                        <gco:CharacterString>Old UUID</gco:CharacterString>
                    </cit:title>
                </cit:CI_Citation>
            </mcc:authority>
            <mcc:code>
                <gco:CharacterString>3796749d-c8a5-46ae-af11-24a977cb1d9a</gco:CharacterString>
            </mcc:code>
            <mcc:codeSpace>
                <gco:CharacterString>urn:uuid</gco:CharacterString>
            </mcc:codeSpace>
        </mcc:MD_Identifier>
    </mdb:metadataIdentifier>
</mdb:MD_Metadata>

这是预期的输出:

<?xml version="1.0" encoding="UTF-8"?>
<mdb:MD_Metadata xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0"
    xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0"
    xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0"
    xmlns:mcc="http://standards.iso.org/iso/19115/-3/mcc/1.0"
    xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0">
    <mdb:metadataIdentifier>
        <mcc:MD_Identifier>
            <mcc:authority>
                <cit:CI_Citation>
                    <cit:title>
                        <gco:CharacterString>New UUID</gco:CharacterString>
                    </cit:title>
                </cit:CI_Citation>
            </mcc:authority>
            <mcc:code>
                <gco:CharacterString>3796749d-c8a5-46ae-af11-24a977cb1d9a</gco:CharacterString>
            </mcc:code>
            <mcc:codeSpace>
                <gco:CharacterString>urn:uuid</gco:CharacterString>
            </mcc:codeSpace>
        </mcc:MD_Identifier>
    </mdb:metadataIdentifier>
    <mdb:defaultLocale>
        <lan:PT_Locale id="EN">
            <lan:language>
                <lan:LanguageCode codeList="http://www.loc.gov/standards/iso639-2/" codeListValue="eng"/>
            </lan:language>
            <lan:characterEncoding>
                <lan:MD_CharacterSetCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_CharacterSetCode" codeListValue="utf8"/>
            </lan:characterEncoding>
        </lan:PT_Locale>
    </mdb:defaultLocale>
    </mdb:MD_Metadata>

我的 xslt 模板:

<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="@*|node()">
    <xsl:copy copy-namespaces="no">
      <!-- Including any attributes it has and any child nodes -->
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
 </xsl:template>

<!-- replace cit:title -->
  <xsl:template match="mdb:metadataIdentifier/mcc:MD_Identifier/mcc:authority/cit:CI_Citation/cit:title/gco:CharacterString/text()">
      <xsl:value-of select="'New UUID'"/>
  </xsl:template>

<xsl:template match="mdb:metadataIdentifier">
   <xsl:copy>
      <xsl:copy-of select="@*" />
      <xsl:copy-of select="node()"/>
    <mdb:defaultLocale>
      <lan:PT_Locale id="EN">
        <lan:language>
          <lan:LanguageCode codeList="http://www.loc.gov/standards/iso639-2/" codeListValue="eng"/>
        </lan:language>
        <lan:characterEncoding>
          <lan:MD_CharacterSetCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_CharacterSetCode" codeListValue="utf8"/>
        </lan:characterEncoding>
      </lan:PT_Locale>
    </mdb:defaultLocale>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
  </xsl:template>

添加了元素 mdb:defaultLocale,但未更新 cit:title 值。如何对同一元素执行多次编辑(例如,替换值、添加子元素)?

使用模板

<xsl:template match="mdb:MD_Metadata">
  <xsl:copy>
    <xsl:apply-templates select="@* , node()"/>
<mdb:defaultLocale>
      <lan:PT_Locale id="EN">
         <lan:language>
            <lan:LanguageCode codeList="http://www.loc.gov/standards/iso639-2/" codeListValue="eng"/>
         </lan:language>
         <lan:characterEncoding>
            <lan:MD_CharacterSetCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_CharacterSetCode" codeListValue="utf8"/>
         </lan:characterEncoding>
      </lan:PT_Locale>
   </mdb:defaultLocale>
  </xsl:copy>
</xsl:template>

并且在其他(原始的,编辑前的)模板中使用 <xsl:apply-templates/> 而不是 <xsl:copy-of select="node()"/>

这是工作样式表:

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0"
    xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0"
    xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0"
    xmlns:mcc="http://standards.iso.org/iso/19115/-3/mcc/1.0"  
    xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0"
                exclude-result-prefixes="#all">
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>

 <xsl:template match="mdb:metadataIdentifier/mcc:MD_Identifier/mcc:authority/cit:CI_Citation/cit:title/gco:CharacterString/text()">
      <xsl:value-of select="'New UUID'"/>
  </xsl:template>

<xsl:template match="@*|node()">
    <xsl:copy copy-namespaces="no">
      <!-- Including any attributes it has and any child nodes -->
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
 </xsl:template>
<xsl:template match="mdb:MD_Metadata">
  <xsl:copy>
    <xsl:apply-templates select="@* , node()"/>
<mdb:defaultLocale>
      <lan:PT_Locale id="EN">
         <lan:language>
            <lan:LanguageCode codeList="http://www.loc.gov/standards/iso639-2/" codeListValue="eng"/>
         </lan:language>
         <lan:characterEncoding>
            <lan:MD_CharacterSetCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_CharacterSetCode" codeListValue="utf8"/>
         </lan:characterEncoding>
      </lan:PT_Locale>
   </mdb:defaultLocale>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>