XSLT添加根节点(如果不存在)

时间:2017-10-26 11:44:44

标签: xslt

我有一些XML并且很难改变它。

示例XML:

<?xml version="1.0" encoding="utf-8"?>
<Cars xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Car> ... </Car>
</Cars>

我想将其更改为:

<?xml version="1.0" encoding="utf-8"?>
<Depot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Cars>
    <Car> ... </Car>
  </Cars>
</Depot>

听起来很简单,但问题是某些数据已经处于预期格式,在这种情况下我不想应用转换。我如何实现这一目标?

修改

一些启动XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" mlns:xsi="http://www.w3.org/2001/XMLSchema-
instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="Cars">
<Depot>
  <Cars>
    <xsl:apply-templates select="*"/>
  </Cars>
</Depot>
</xsl:template>

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

3 个答案:

答案 0 :(得分:1)

我认为你只想匹配Cars如果它是根元素,那么代替你的模板匹配&#34;汽车&#34;,改变它以匹配&#34; /汽车&#34;

<xsl:template match="/Cars">

试试这个XSLT(我稍微修改了一下,以获得第一个调用身份模板的模板)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" >

    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/Cars">
      <Depot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <xsl:call-template name="identity" />
      </Depot>
    </xsl:template>

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

答案 1 :(得分:0)

我认为只需要在根模板中使用选择来测试节点是否存在,如果不存在则创建它:

<xsl:template match="/">
    <xsl:choose>
        <xsl:when test="Depot">
            <xsl:apply-templates/>
        </xsl:when>
        <xsl:otherwise>
            <Depot>
                <xsl:apply-templates/>
            </Depot>
        </xsl:otherwise>
    </xsl:choose> 
</xsl:template>

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

答案 2 :(得分:0)

这也提供相同的输出。

   <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" >

    <xsl:template match="Cars">
    <Depot>
        <xsl:copy-of select="."/>
    </Depot>
    </xsl:template>

</xsl:stylesheet>