Xslt将一个转换为另一个并添加一行

时间:2014-11-11 16:12:47

标签: xslt xsd

说我有这样的XML。我想介绍一个<row3>元素。

<create xmlns="urn:partner.com"
  <objects xmlns:p0="urn:s.partner.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="p0:IED">
    <row1 xmlns="urn:s.partner.com">BookingDataFromCastIron</row1>
    <row2 xmlns="urn:s.partner.com">Csv</row2>
  </objects>
</create>"

我正在使用以下XSLT。但它提供与输出相同的XML。我错过了什么吗?

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

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

1 个答案:

答案 0 :(得分:0)

这完全与命名空间有关,如果源XML中没有命名空间,基本上上面的模板匹配只会命中object。但是,您确实有一个命名空间集xmlns="urn:partner.com",因此您需要使用以下命令删除对命名空间的绑定:<xsl:template match="*:objects">

我认为你正在寻找这个,但它挑衅地推动你朝着正确的方向前进:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="*:objects">  
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
            <xsl:element name="row3" xmlns="urn:s.partner.com">IED</xsl:element>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

输出:

<create xmlns="urn:partner.com">
   <objects xmlns:p0="urn:s.partner.com"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <row1 xmlns="urn:s.partner.com">BookingDataFromCastIron</row1>
      <row2 xmlns="urn:s.partner.com">Csv</row2>
      <row3 xmlns="urn:s.partner.com">IED</row3>
   </objects>
</create>