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

Transform XML to add 'nil' attributes to empty elements

我们使用的现有 XML 提要有很多属性,其值可能会丢失,我们希望将这些属性视为 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 值。

以下应该有效。

<?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 />

相同