2012-01-16 3 views
3

私はこの1つに固執しています。 子要素を先頭に付ける方法と、囲む要素の属性を保持する方法を理解できません。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> 
       </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> 

を持っていると私は、このXPathは、私は私が私のXSLTを実行すると、 "行方不明" の子要素

GXXML/FEATURECLASS/SUBTYPE//FIELD/AUTOVALUE[@EDITEVENT='mmEventFeatureCreate'][not(AUTOGENID)] 

を挿入したい要素をchosesがこの

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

をしたいです私は属性を失いますが、子要素は正しい順序になっています またはchile要素は正しい順序ではない(dtdは検証しない)が、囲むタグは属性を保持する。この示し

XSLT:

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

私は、XSLTから取得出力:

編集ティム・Cの答えの後
<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> 

:これは、所望の出力を与えるXSLTがある

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

答えて

5

これを交換する必要があります。

これにより
<xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    <AUTOGENID>{DE2DCE92-8CCF-42DB-B9F9-89D1DE5EDE6A}</AUTOGENID> 
    <AUTOVALUENAME>ESRI Field Rules</AUTOVALUENAME> 
</xsl:copy> 

...

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

、あなたは、あなたの新しいノードを追加し、他の既存のノードをコピーし、最初の属性をコピー..