Una vez creados los metadatos, inevitablemente, parte de la información que contienen cambiará con el tiempo. Si la información es específica de un elemento de ArcGIS, puede editar sus metadatos para cambiar la información. Sin embargo, si la información que ha cambiado está incluida en los metadatos para muchos elementos de ArcGIS, el proceso de editar manualmente los metadatos para todos los elementos afectados resulta tedioso. Por suerte, hay diversas técnicas disponibles para actualizar los metadatos de muchos elementos de una vez.
Se considera que los metadatos son internos para los elementos de ArcGIS, con independencia del modo en que un elemento de ArcGIS almacena esta información. Cuando se le pide a un elemento de ArcGIS que proporcione sus metadatos, suministra esa información como un documento XML. Hay dos estrategias generales para actualizar los metadatos almacenados en el documento XML proporcionado. El método más común para cambiar el contenido de un archivo XML es usar una hoja de estilo XSLT. Los archivos XML también se pueden modificar a través de la programación. En ambos casos, primero debe guardar el documento XML en un archivo XML. A continuación, puede modificar el contenido del archivo XML procesándolo con una hoja de estilos XSLT o modificando el contenido a través de la programación, por ejemplo en una secuencia de comandos de Python.
Crear una hoja de estilos XSLT para actualizar metadatos
Puede usar una hoja de estilos XSLT personalizada para actualizar el contenido de metadatos de un elemento. Un modelo como el que se muestra a continuación se puede usar para procesar primero los metadatos de un elemento usando la hoja de estilos XSLT de su elección con la herramienta Transformación XSLT. El resultado de este proceso se guarda en un archivo XML. A continuación, el modelo vuelve a guardar el documento XML actualizado en el elemento de ArcGIS original como metadatos utilizando la herramienta Importador de metadatos.
Más información sobre el procesamiento de los metadatos de un elemento con hojas de estilos XSLT
Hay muchos recursos disponibles en Internet que pueden ayudarle a obtener información sobre cómo crear hojas de estilos XSLT personalizadas. No obstante, los ejemplos siguientes le ayudarán a empezar. Muestran cómo cambiar la información de contacto de una organización.
Suponga que los metadatos originales incluyeran un contacto de metadatos como se muestra a continuación, donde se cumple la siguiente condición;
- El nombre individual es Recepción.
- El nombre de la organización es Esri Learning Center.
- La dirección es 380 New York St.
- La ciudad es Redlands.
- El estado es California, CA.
- El código postal es 92373.
- El país es Estados Unidos de América, US.
- La dirección de correo electrónico es info@esri.com.
- El número de teléfono es 909-793-2853.
- El número de fax es 909-793-4801.
- La función especificada para este contacto es publicador, 010.
Un extracto de un documento XML de metadatos donde se debe actualizar la información de contacto de una organización.
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<mdContact>
<rpIndName>Reception</rpIndName>
<rpOrgName>Esri Learning Center</rpOrgName>
<rpCntInfo>
<cntAddress>
<delPoint>380 New York St.</delPoint>
<city>Redlands</city>
<adminArea>CA</adminArea>
<postCode>92373</postCode>
<country>US</country>
<eMailAdd>info@esri.com</eMailAdd>
</cntAddress>
<cntPhone>
<voiceNum>909-793-2853</voiceNum>
<faxNum>909-793-4801</faxNum>
</cntPhone>
</rpCntInfo>
<role>
<RoleCd value="010"/>
</role>
</mdContact>
...
</metadata>
En este supuesto, esta información de contacto se debe editar de la manera siguiente:
- Quite el nombre individual de la información de contacto.
- Cambie el código postal a 92373-8100.
- Cambie la dirección de correo electrónico a LearnGIS@esri.com.
- Cambie el número de teléfono a 888-377-4575 x.1-3204.
- Agregue la ubicación de una página web en la que puede encontrar información en Internet, http://www.esri.com/training.
- Agregue información sobre el horario para contactar con la organización, 8:00 a.m. a 5:00 p.m., hora del Pacífico.
El resto de la información de contacto se quedará igual.
La siguiente hoja de estilos XSLT realizará estas ediciones. El elemento de metadatos del nombre individual se eliminará. La dirección completa, con todos sus elementos de metadatos individuales, se actualiza de una vez. El número de teléfono se actualiza por separado del resto de la información telefónica. Para agregar la página web y las horas de disponibilidad, se debe copiar toda la información de contacto existente para que no se pierda antes de agregar la nueva información.
Una hoja de estilos XSLT que edita información de contacto para una organización y copia el resto del contenido de metadatos.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no" />
<!-- process the metadata using the templates below -->
<xsl:template match="/">
<xsl:apply-templates select="node() | @*" />
</xsl:template>
<!-- copy all metadata conent -->
<xsl:template match="node() | @*" priority="0">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<!-- all metadata XSLT stylesheets used to update metadata should be identical to this example up to this point -->
<!-- add the templates you'll use to update the metadata below -->
<!-- remove the individual name from the contact information for the organization name Esri Learning Center -->
<xsl:template match="rpIndName[../rpOrgName = 'Esri Learning Center']" priority="1" >
</xsl:template>
<!-- edit the address for any contact with the organization name Esri Learning Center -->
<xsl:variable name="newAddress" >
<cntAddress>
<delPoint>380 New York St.</delPoint>
<city>Redlands</city>
<adminArea>CA</adminArea>
<postCode>92373-8100</postCode>
<country>US</country>
<eMailAdd>LearnGIS@esri.com</eMailAdd>
</cntAddress>
</xsl:variable>
<xsl:template match="cntAddress[../../rpOrgName = 'Esri Learning Center']" priority="1" >
<xsl:copy-of select="$newAddress" />
</xsl:template>
<!-- edit all contacts with the organization name Esri Learning Center to have a new phone number -->
<xsl:variable name="newPhone">888-377-4575 x.1-3204</xsl:variable>
<xsl:template match="voiceNum[../../../rpOrgName = 'Esri Learning Center']" priority="1" >
<voiceNum><xsl:value-of select="$newPhone" /></voiceNum>
</xsl:template>
<!-- add hours of availability for the organization name Esri Learning Center -->
<xsl:template match="rpCntInfo[../rpOrgName = 'Esri Learning Center']" priority="1" >
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
<cntOnlineRes>
<linkage>http://www.esri.com/training</linkage>
</cntOnlineRes>
<cntHours>8:00am to 5:00pm Pacific Time</cntHours>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Cuando se utiliza esta hoja de estilos XSLT para editar los metadatos de ejemplo antes mostrados utilizando la herramienta Transformación XSLT, se crea el archivo XML siguiente como salida. Utilice la herramienta Importador de metadatos para guardar estos cambios con el elemento de ArcGIS original.
Un extracto de los metadatos actualizados producidos por la hoja de estilos XSLT anterior.
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<mdContact>
<rpOrgName>Esri Learning Center</rpOrgName>
<rpCntInfo>
<cntAddress>
<delPoint>380 New York St.</delPoint>
<city>Redlands</city>
<adminArea>CA</adminArea>
<postCode>92373-8100</postCode>
<country>US</country>
<eMailAdd>LearnGIS@esri.com</eMailAdd>
</cntAddress>
<cntPhone>
<voiceNum>888-377-4575 x.1-3204</voiceNum>
<faxNum>909-793-4801</faxNum>
</cntPhone>
<cntOnlineRes>
<linkage>http://www.esri.com/training</linkage>
</cntOnlineRes>
<cntHours>8:00am to 5:00pm Pacific Time</cntHours>
</rpCntInfo>
<role>
<RoleCd value="010"/>
</role>
</mdContact>
...
</metadata>
Con ArcGIS Desktop, se proporcionan varias hojas de estilos XSLT para complementar los modelos de geoprocesamiento de metadatos de la caja de herramientas Conversión, en la carpeta <ArcGIS Installation Location>\Metadata\Stylesheets\gpTools. Utilícelas como ejemplos.
Al crear hojas de estilos propias, es útil entender el formato XML con el que se está trabajando. Un DTD XML que describe el formato XML de metadatos de ArcGIS se proporciona en la carpeta <ArcGIS Installation Location>\Metadata\Translator\Rules.
Actualizar los metadatos con secuencias de comandos de Python
Otra opción es usar una secuencia de comandos de Python para actualizar el contenido de metadatos de un elemento. La secuencia de comandos de Python debe ejecutar las mismas herramientas de geoprocesamiento que el modelo antes descrito que procesa los metadatos usando una hoja de estilos XSLT. La herramienta Transformación XSLT se usa primero para guardar una copia de los metadatos del elemento en un archivo XML usando la hoja de estilos exact copy of.xslt proporcionada con ArcGIS Desktop. El archivo XML resultante se puede modificar con una secuencia de comandos de Python. A continuación, el documento XML actualizado se debe volver a guardar en el elemento de ArcGIS original como metadatos usando la herramienta Importador de metadatos.
La secuencia de comandos de Python siguiente cambia el texto de un elemento Propósito existente, si lo hay, y agrega un nuevo elemento Créditos. El documento XML se modifica usando la API ElementTree de Python, que se documenta en la biblioteca de Python estándar. Puede haber otras API disponibles en otros paquetes de Python para modificar archivos XML. Si lo prefiere, puede elegir una de esas.
Una secuencia de comandos de Python que actualiza el elemento Propósito existente y agrega un nuevo elemento Créditos a los metadatos de un elemento.
# batch update metadata for datasets in a folder
import os, sys
import arcpy
import xml.etree.ElementTree as ET
# arcpy environments
arcpy.env.overwriteOutput = "True"
# Script arguments...
Source_Metadata = arcpy.GetParameter(0)
# Local variables
# new purpose text
newPurpose = "This is new text for an existing Purpose metadata element."
newCredits = "This is text for a new Credits metadata element."
# install location
dir = arcpy.GetInstallInfo("desktop")["InstallDir"]
# stylesheet to use
copy_xslt = r"{0}".format(os.path.join(dir,"Metadata\Stylesheets\gpTools\exact copy of.xslt"))
arcpy.AddMessage("XSLT: {0}".format(copy_xslt))
def update_metadata(root):
num_elements = 0
# modify purpose element's text
# there is only supposed to be one purpose element in metadata
# replace purpose element text if element exists
# if element doesn't exist, do nothing
purposeEls = root.findall(".//idPurp")
for element in purposeEls:
if element.text is not None:
element.text = newPurpose
num_elements += 1
# add credits element to dataIdInfo parent, if the parent exists
# ISO allows many dataIdInfo groups; ArcGIS generally supports only one, get the 1st
# ISO allows many idCredit elements: 1st on Item Description page, all on Resource Details page
# always append new idCredit element to 1st dataIdInfo with appropriate text
# existing idCredit elements remain in place
dataIdInfoEls = root.findall("./dataIdInfo[1]")
for element in dataIdInfoEls:
if element:
newCreditEl = ET.SubElement(element,"idCredit")
newCreditEl.text = newCredits
num_elements += 1
return num_elements
for item in Source_Metadata:
arcpy.AddMessage("Item: {0}".format(item))
# temporary XML file
xmlfile = arcpy.CreateScratchName(".xml",workspace=arcpy.env.scratchFolder)
#arcpy.AddMessage("Temporary XML file: {0}".format(xmlfile))
# export xml
arcpy.XSLTransform_conversion(item, copy_xslt, xmlfile, "")
# read in XML
tree = ET.parse(xmlfile)
root = tree.getroot()
changes = update_metadata(root)
#arcpy.AddMessage("number of elements updated: {0}".format(changes))
if changes > 0:
# save modifications to XML
#arcpy.AddMessage("Saving changes to temporary file...")
tree.write(xmlfile)
# import result back into metadata
arcpy.AddMessage("Saving updated metadata with the item...")
arcpy.MetadataImporter_conversion(xmlfile, item)
else:
arcpy.AddMessage("No changes to save")
arcpy.AddMessage('Finished updating metadata for all source metadata items')