gpt4 book ai didi

xslt 在子标签前面加上

转载 作者:行者123 更新时间:2023-12-01 03:31:09 24 4
gpt4 key购买 nike

我被困在这一点上。
无法弄清楚如何添加子元素并保留封闭元素的属性。

我有

<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 时,我要么失去了属性,但子元素的顺序是正确的
或者智利元素 i 的顺序不正确(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>

在 Tim C 的回答后编辑:
这是提供所需输出的 ​​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>

最佳答案

你需要做的就是更换这个......

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

因此,您首先复制属性,然后添加新节点,然后复制其他现有节点。

关于xslt 在子标签前面加上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8880852/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com