xslt prepend дочерний тег - PullRequest
3 голосов
/ 16 января 2012

Я застрял на этом. Не могу понять, как добавить к дочернему элементу атрибуты включающего элемента и сохранить их.

У меня есть

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

И я хочу это

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

Этот Xpath выбирает элементы, в которые я хочу вставить «отсутствующие» дочерние элементы

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

Когда я запускаю xslt, я либо теряю атрибуты, но дочерний элемент находится в правильном порядке. или элемент Чили не в правильном порядке (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:

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

1 Ответ

5 голосов
/ 16 января 2012

Все, что вам нужно сделать, это заменить это ....

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

Итак, вы сначала копируете атрибуты, а затем добавляете новыеузлы, а затем скопируйте другие существующие узлы ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...