我正在开发一个功能,我应该将现有的XML节点替换为另一个。我已经编写了代码来实现相同的目标。但是它只替换根节点而不是子节点。如果您注意到根节点SpecExportViewModel被节点Spec替换。但是,子节点按原样返回而不进行转换。例如,根据XSLT代码,节点OpeningsExportViewModel不会被节点DRSCHEDS替换。我出错的任何建议?
请在下面找到我的XML和XSLT文件。
<SpecExportViewModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-
<Openings>
-
<OpeningsExportViewModel>
<SpecId>1945</SpecId>
<MarkNumber>UNI</MarkNumber>
<DoorNumber>UNI</DoorNumber>
<AreaNumber />
<Quantity>1</Quantity>
<OutSideLocation />
<InsideLocation />
<HardwareSetNumber>HOSASET</HardwareSetNumber>
<Hand>AS</Hand>
<ActiveDegree />
<InActiveDegree />
<FrameType>UNK</FrameType>
<DoorType>UNK</DoorType>
<Remarks />
<Scratch />
<Rating>20PP</Rating>
<Height>84</Height>
<Width>41</Width>
<Thickness>1.75</Thickness>
<Mode />
<ActiveleafWidth />
<ActiveLeafHeight />
<InactiveLeafWidth />
<InactiveLeafHeight />
<Transom>NON</Transom>
<TransomHeight />
<TransombarFacedim />
<FrameConfig>3SIDED</FrameConfig>
<TempRise>False</TempRise>
<LeadLined>False</LeadLined>
<StormLabel />
<StcRating />
<ArchDrElev />
<ArchFrElev />
<ArchHeadDetail />
<ArchJambDetail />
<ArchSillDetail />
<Tags />
<Walltype>VERIFY</Walltype>
<WallThick>4.875</WallThick>
<KeyGrp />
<OsFloorFin />
<InFloorFin />
<OurSillDetail />
<Accessories />
<Frameset />
<Doorset />
<ExporteDhDwe />
<SillDwg />
<Exterior />
<Modifier />
<AutoHdg />
</OpeningsExportViewModel>
</Openings>
</SpecExportViewModel>
&#13;
XSLT文件:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="SpecExportViewModel">
<Spec>
<xsl:apply-templates select="@*|node()" />
</Spec>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="*[@*]">
<xsl:copy>
<xsl:apply-templates select="node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="SpecExportViewModel/OpeningsExportViewModel">
<DRSCHEDS>
<xsl:apply-templates select="text()" />
</DRSCHEDS>
</xsl:template>
<xsl:template match="SpecExportViewModel/OpeningsExportViewModel/Openings">
<DRSCHED>
<xsl:apply-templates select="text()" />
</DRSCHED>
</xsl:template>
</xsl:stylesheet>
&#13;
提前致谢。
答案 0 :(得分:0)
您在模板匹配时的XPath错误。
SpecExportViewModel/OpeningsExportViewModel
,和
SpecExportViewModel/OpeningsExportViewModel/Openings
Openings
是您输入中OpeningsExportViewModel
的父级(不是孩子)。
如果它只是您想要更改的元素名称(并保持属性和其他未指定的节点相同),请使用以下内容:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="SpecExportViewModel">
<Spec>
<xsl:apply-templates select="@*|node()" />
</Spec>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="SpecExportViewModel/Openings">
<DRSCHEDS>
<xsl:apply-templates select="@* | node()" />
</DRSCHEDS>
</xsl:template>
<xsl:template match="SpecExportViewModel/Openings/OpeningsExportViewModel">
<DRSCHED>
<xsl:apply-templates select="@* | node()" />
</DRSCHED>
</xsl:template>
</xsl:stylesheet>