为XSLT Copy-Of编写模板以转换具有差异的消息。怎么样?

时间:2012-03-20 17:26:35

标签: xml xslt xsd transformation

我有一个旧架构(xsd)格式的xml消息。我的新架构完全相同,但我在旧版本中嵌入了一个元素。例如:

我的旧架构有一个元素:

<exclude> MyRestriction </exclude>

但我的新架构是这样的:

<exclude> <restriction> MyRestriction </restriction> </exclude>

并且整个消息与之前相同。上次我曾经做过副本但是现在 我需要一个模板,复制所有内容,但将exclude的值移动到限制标记。有人可以帮我吗?

由于

2 个答案:

答案 0 :(得分:2)

您可以使用模板匹配排除模板

中的文字
<xsl:template match="exclude/text()">
   <restriction><xsl:value-of select="." /></restriction>
</xsl:template>

如果需要,这种方式会将排除中的任何其他子元素保留在其中。

因此,给出以下XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="exclude/text()">
      <restriction><xsl:value-of select="." /></restriction>
   </xsl:template>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

应用于以下XML

<exclude ex="1"> MyRestriction <test>Hello</test> </exclude>

以下是输出

<exclude ex="1">
   <restriction> MyRestriction </restriction>
   <test>Hello</test>
</exclude>

答案 1 :(得分:1)

使用此模板:

<xsl:template match="exclude">
  <xsl:copy>
    <restriction>
      <xsl:value-of select="."/>
    </restriction>
  </xsl:copy>
</xsl:template>