Home > Software engineering >  XSLT - how to edit multiple child elements
XSLT - how to edit multiple child elements

Time:03-14

I want to edit a child element value (cit:title) and add another element (mdb:defaultLocale). Here is my 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>

Here is the expected output:

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

My xslt template:

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

The element mdb:defaultLocale is added, but the cit:title value is not updated. How can I perform multiple edits (e.g., replace value, add child) of the same element?

CodePudding user response:

Use a 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>

and in that other (original, before the edit) template use <xsl:apply-templates/> instead of <xsl:copy-of select="node()"/>.

CodePudding user response:

Here is working stylesheet:

<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>
  • Related