转换XML以添加' nil'属性为空元素

时间:2016-07-11 09:47:37

标签: xml xslt xsd

我们使用的现有XML Feed有很多属性,其值可能会丢失,我们希望将这些属性视为NULL而不是可选值或空值,因为它会使强制执行严格的输入更加困难并且会影响我们的自动代码生成等等

例如我们可能会收到: <LASTUPDATED/>

我们没有正式的XSD,但我们自己创建了一个...目前可能看起来像:<xs:element type="xs:dateTime" name="LASTUPDATED"/>

这不会对显示的XML进行验证(""不是有效的dateTime)。理想情况下,它会在XML(nillable and minOccurs XSD element attributes

中包含xsi:nil=true

由于我们无法控制Feed,我是否可以创建一个用<xxx/>替换任何<myElement xsi:nil='true'/>元素的转换?相反,将我们的XSD更改为使用minOccurs并不是很好,因为我们必须检查每个元素是否存在,而不仅仅是支持NULL值。

1 个答案:

答案 0 :(得分:1)

以下情况应该有效。

<?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">
    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="*[not(text())]">
        <xsl:copy>
            <xsl:attribute name="xsi:nil">true</xsl:attribute>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

但是,这也会匹配<LASTUPDATED></LASTUPDATED>,它在语义上与<LASTUPDATED />相同