XSLT:添加节点!

时间:2010-07-12 15:38:09

标签: xslt

如何使用XSLT在我的XML块周围封装节点? 例如,我有以下XML文件。

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />

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

我的输入XML文件如下所示。

  <Root>
<Location><Name>Pennsylvania</Name><Type>State</Type></Location>
</Root>

我希望输出看起来像这样。

      <Root><Container>
    <Location><Name>Pennsylvania</Name><Type>State</Type></Location>
</Container>
    </Root>

我希望确保每次都应用一个名为<CONTAINER>的节点,它会复制来自Root / Location的信息。我需要对XSLT文件进行哪些更改?

2 个答案:

答案 0 :(得分:1)

我只是猜测,在猜测模式似乎你想要这个

编辑:得到了Mads Hansen的另一个猜测......

添加到您已有的身份模板中:

<xsl:template match="Location">
  <CONTAINER><xsl:apply-templates/></CONTAINER>
</xsl:template>

答案 1 :(得分:1)

总结评论中的所有答案,这个:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Location">
        <Container>
            <xsl:call-template name="identity"/>
        </Container>
    </xsl:template>
</xsl:stylesheet>

结果:

<Root>
    <Container>
        <Location>
            <Name>Pennsylvania</Name>
            <Type>State</Type>
        </Location>
    </Container>
</Root>