添加了 xsi:nil="true" 和默认命名空间,并在转换后生成 xmlns=""
Added xsi:nil="true" and default namespace and it produces xmlns="" after transform
我正在尝试为空元素和所有元素添加默认命名空间 xsi:nil="true"。
转换成功地反映了这些名称空间,但 child 的 child 现在包含一个空白的 xmlns 属性。我怎样才能避免这种情况 xmlns=""
?
XSLT 代码段:
<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:template match="*">
<xsl:element name="{local-name()}" namespace="http://xmlns.oracle.com/pcbpel/adapter/db/ORESB_STAAConfig_DBAdapter">
<xsl:namespace name="xsi" select="'http://www.w3.org/2001/XMLSchema-instance'"/>
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
XML:
<ORESB_STAAConfig_DBAdapterOutput>
<ACODE>A52557</ACODE>
<DESC_TO_CP>WLR ISDN2E System</DESC_TO_CP>
<TYPE>EX</TYPE>
<INSTALLATION_TYPE>Standard</INSTALLATION_TYPE>
<PAYPHONE_TYPE/>
<TERMINATION_TYPE>NTE</TERMINATION_TYPE>
</ORESB_STAAConfig_DBAdapterOutput>
<ORESB_STAAConfig_DBAdapterOutput>
<ACODE>A52558</ACODE>
<DESC_TO_CP>WLR ISDN2E System</DESC_TO_CP>
<TYPE>EX</TYPE>
<INSTALLATION_TYPE>Standard</INSTALLATION_TYPE>
<PAYPHONE_TYPE/>
<TERMINATION_TYPE>NTE</TERMINATION_TYPE>
</ORESB_STAAConfig_DBAdapterOutput>
</ORESB_STAAConfig_DBAdapterOutputCollection>
结果XML:
<ORESB_STAAConfig_DBAdapterOutputCollection xmlns="http://xmlns.oracle.com/pcbpel/adapter/db/ORESB_STAAConfig_DBAdapter"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ORESB_STAAConfig_DBAdapterOutput>
<ACODE>A52557</ACODE>
<DESC_TO_CP>WLR ISDN2E System</DESC_TO_CP>
<TYPE>EX</TYPE>
<INSTALLATION_TYPE>Standard</INSTALLATION_TYPE>
<PAYPHONE_TYPE xmlns="" xsi:nil="true"/>
<TERMINATION_TYPE>NTE</TERMINATION_TYPE>
</ORESB_STAAConfig_DBAdapterOutput>
<ORESB_STAAConfig_DBAdapterOutput>
<ACODE>A52558</ACODE>
<DESC_TO_CP>WLR ISDN2E System</DESC_TO_CP>
<TYPE>EX</TYPE>
<INSTALLATION_TYPE>Standard</INSTALLATION_TYPE>
<PAYPHONE_TYPE xmlns="" xsi:nil="true"/>
<TERMINATION_TYPE>NTE</TERMINATION_TYPE>
</ORESB_STAAConfig_DBAdapterOutput>
</ORESB_STAAConfig_DBAdapterOutputCollection>
如果你想改变所有元素的命名空间,那么你不能在
中使用xsl:copy
<xsl:template match="*[not(text())]">
<xsl:copy>
但需要
<xsl:template match="*[not(text())]">
<xsl:element name="{local-name()}" namespace="http://xmlns.oracle.com/pcbpel/adapter/db/ORESB_STAAConfig_DBAdapter">
我正在尝试为空元素和所有元素添加默认命名空间 xsi:nil="true"。
转换成功地反映了这些名称空间,但 child 的 child 现在包含一个空白的 xmlns 属性。我怎样才能避免这种情况 xmlns=""
?
XSLT 代码段:
<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:template match="*">
<xsl:element name="{local-name()}" namespace="http://xmlns.oracle.com/pcbpel/adapter/db/ORESB_STAAConfig_DBAdapter">
<xsl:namespace name="xsi" select="'http://www.w3.org/2001/XMLSchema-instance'"/>
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
XML:
<ORESB_STAAConfig_DBAdapterOutput>
<ACODE>A52557</ACODE>
<DESC_TO_CP>WLR ISDN2E System</DESC_TO_CP>
<TYPE>EX</TYPE>
<INSTALLATION_TYPE>Standard</INSTALLATION_TYPE>
<PAYPHONE_TYPE/>
<TERMINATION_TYPE>NTE</TERMINATION_TYPE>
</ORESB_STAAConfig_DBAdapterOutput>
<ORESB_STAAConfig_DBAdapterOutput>
<ACODE>A52558</ACODE>
<DESC_TO_CP>WLR ISDN2E System</DESC_TO_CP>
<TYPE>EX</TYPE>
<INSTALLATION_TYPE>Standard</INSTALLATION_TYPE>
<PAYPHONE_TYPE/>
<TERMINATION_TYPE>NTE</TERMINATION_TYPE>
</ORESB_STAAConfig_DBAdapterOutput>
</ORESB_STAAConfig_DBAdapterOutputCollection>
结果XML:
<ORESB_STAAConfig_DBAdapterOutputCollection xmlns="http://xmlns.oracle.com/pcbpel/adapter/db/ORESB_STAAConfig_DBAdapter"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ORESB_STAAConfig_DBAdapterOutput>
<ACODE>A52557</ACODE>
<DESC_TO_CP>WLR ISDN2E System</DESC_TO_CP>
<TYPE>EX</TYPE>
<INSTALLATION_TYPE>Standard</INSTALLATION_TYPE>
<PAYPHONE_TYPE xmlns="" xsi:nil="true"/>
<TERMINATION_TYPE>NTE</TERMINATION_TYPE>
</ORESB_STAAConfig_DBAdapterOutput>
<ORESB_STAAConfig_DBAdapterOutput>
<ACODE>A52558</ACODE>
<DESC_TO_CP>WLR ISDN2E System</DESC_TO_CP>
<TYPE>EX</TYPE>
<INSTALLATION_TYPE>Standard</INSTALLATION_TYPE>
<PAYPHONE_TYPE xmlns="" xsi:nil="true"/>
<TERMINATION_TYPE>NTE</TERMINATION_TYPE>
</ORESB_STAAConfig_DBAdapterOutput>
</ORESB_STAAConfig_DBAdapterOutputCollection>
如果你想改变所有元素的命名空间,那么你不能在
中使用xsl:copy
<xsl:template match="*[not(text())]">
<xsl:copy>
但需要
<xsl:template match="*[not(text())]">
<xsl:element name="{local-name()}" namespace="http://xmlns.oracle.com/pcbpel/adapter/db/ORESB_STAAConfig_DBAdapter">