I’m stuck on this one.
Can’t figure out how to prepend an child element and keep the attributes of the enclosing element.
I Have
<GXXML>
<FEATURECLASS ProgID="mmGeoDatabase.MMFeatureClass.1">
<SUBTYPE ProgID="mmGeoDatabase.MMSubType.1">
<FIELD ProgID="mmGeoDatabase.MMField.1">
<AUTOVALUE ProgID="mmGeoDatabase.MMAutoValue.1" EDITEVENT="mmEventFeatureCreate" EDITORTYPE="0">
<AVDISPLAYORDER>0</AVDISPLAYORDER>
<AVEDMTABLESUBTYPE>888888</AVEDMTABLESUBTYPE>
<AVEDMPROPERTYTYPE>888888</AVEDMPROPERTYTYPE>
</AUTOVALUE>
</FIELD>
<FIELD ProgID="mmGeoDatabase.MMField.1">
<AUTOVALUE ProgID="mmGeoDatabase.MMAutoValue.1" EDITEVENT="mmEventFeatureCreate" EDITORTYPE="0">
<AVDISPLAYORDER>0</AVDISPLAYORDER>
<AVEDMTABLESUBTYPE>888888</AVEDMTABLESUBTYPE>
<AVEDMPROPERTYTYPE>888888</AVEDMPROPERTYTYPE>
</AUTOVALUE>
</FIELD>
</SUBTYPE>
</FEATURECLASS>
</GXXML>
And I want this
<GXXML>
<FEATURECLASS ProgID="mmGeoDatabase.MMFeatureClass.1">
<SUBTYPE ProgID="mmGeoDatabase.MMSubType.1">
<FIELD ProgID="mmGeoDatabase.MMField.1">
<AUTOVALUE ProgID="mmGeoDatabase.MMAutoValue.1" EDITEVENT="mmEventFeatureCreate" EDITORTYPE="0">
<AUTOGENID>{DE2DCE92-8CCF-42DB-B9F9-89D1DE5EDE6A}</AUTOGENID>
<AUTOVALUENAME>ESRI Field Rules</AUTOVALUENAME>
<AVDISPLAYORDER>0</AVDISPLAYORDER>
<AVEDMTABLESUBTYPE>888888</AVEDMTABLESUBTYPE>
<AVEDMPROPERTYTYPE>888888</AVEDMPROPERTYTYPE>
</AUTOVALUE>
</FIELD>
<FIELD ProgID="mmGeoDatabase.MMField.1">
<AUTOVALUE ProgID="mmGeoDatabase.MMAutoValue.1" EDITEVENT="mmEventFeatureCreate" EDITORTYPE="0">
<AUTOGENID>{DE2DCE92-8CCF-42DB-B9F9-89D1DE5EDE6A}</AUTOGENID>
<AUTOVALUENAME>ESRI Field Rules</AUTOVALUENAME>
<AVDISPLAYORDER>0</AVDISPLAYORDER>
<AVEDMTABLESUBTYPE>888888</AVEDMTABLESUBTYPE>
<AVEDMPROPERTYTYPE>888888</AVEDMPROPERTYTYPE>
</AUTOVALUE>
</FIELD>
</SUBTYPE>
</FEATURECLASS>
</GXXML>
This Xpath choses elements where I want to insert “missing” child elements
GXXML/FEATURECLASS/SUBTYPE//FIELD/AUTOVALUE[@EDITEVENT='mmEventFeatureCreate'][not(AUTOGENID)]
When I run my xslt I either loses attributes, but child element is in the right order
or the chile element i not in the right order (dtd does not validate) but the enclosing tag keeps the attributes.
An xslt that shows this:
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|text()|comment()|processing-instruction()">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="GXXML/FEATURECLASS/SUBTYPE/FIELD[1]/AUTOVALUE[@EDITEVENT='mmEventFeatureCreate'][not(AUTOGENID)]">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
<AUTOGENID>{DE2DCE92-8CCF-42DB-B9F9-89D1DE5EDE6A}</AUTOGENID>
<AUTOVALUENAME>ESRI Field Rules</AUTOVALUENAME>
</xsl:copy>
</xsl:template>
<xsl:template match="GXXML/FEATURECLASS/SUBTYPE/FIELD[2]/AUTOVALUE[@EDITEVENT='mmEventFeatureCreate'][not(AUTOGENID)]">
<xsl:copy>
<AUTOGENID>{DE2DCE92-8CCF-42DB-B9F9-89D1DE5EDE6A}</AUTOGENID>
<AUTOVALUENAME>ESRI Field Rules</AUTOVALUENAME>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
The output I get from my xslt:
<GXXML>
<FEATURECLASS ProgID="mmGeoDatabase.MMFeatureClass.1">
<SUBTYPE ProgID="mmGeoDatabase.MMSubType.1">
<FIELD ProgID="mmGeoDatabase.MMField.1">
<AUTOVALUE ProgID="mmGeoDatabase.MMAutoValue.1" EDITEVENT="mmEventFeatureCreate" EDITORTYPE="0">
<AVDISPLAYORDER>0</AVDISPLAYORDER>
<AVEDMTABLESUBTYPE>888888</AVEDMTABLESUBTYPE>
<AVEDMPROPERTYTYPE>888888</AVEDMPROPERTYTYPE>
<AUTOGENID>{DE2DCE92-8CCF-42DB-B9F9-89D1DE5EDE6A}</AUTOGENID>
<AUTOVALUENAME>ESRI Field Rules</AUTOVALUENAME>
</AUTOVALUE>
</FIELD>
<FIELD ProgID="mmGeoDatabase.MMField.1">
<AUTOVALUE>
<AUTOGENID>{DE2DCE92-8CCF-42DB-B9F9-89D1DE5EDE6A}</AUTOGENID>
<AUTOVALUENAME>ESRI Field Rules</AUTOVALUENAME>
<AVDISPLAYORDER>0</AVDISPLAYORDER>
<AVEDMTABLESUBTYPE>888888</AVEDMTABLESUBTYPE>
<AVEDMPROPERTYTYPE>888888</AVEDMPROPERTYTYPE>
</AUTOVALUE>
</FIELD>
</SUBTYPE>
</FEATURECLASS>
</GXXML>
Edit after Tim C’s answer:
This is the xslt that gives the desired output
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|text()|comment()|processing-instruction()">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="GXXML/FEATURECLASS/SUBTYPE//FIELD/AUTOVALUE[@EDITEVENT='mmEventFeatureCreate'][not(AUTOGENID)]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<AUTOGENID>{DE2DCE92-8CCF-42DB-B9F9-89D1DE5EDE6A}</AUTOGENID>
<AUTOVALUENAME>ESRI Field Rules</AUTOVALUENAME>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
All you need to do is replace this….
With this…
So, you copy the attributes first, then add your new nodes, and then copy the other existing nodes..