转换 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 />
相同
我们使用的现有 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 />