使用XSLT替换XML节点仅在根级别工作

时间:2015-01-28 05:41:39

标签: xslt

我正在开发一个功能,我应该将现有的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;
&#13;
&#13;

XSLT文件:

&#13;
&#13;
<?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;
&#13;
&#13;

提前致谢。

1 个答案:

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