删除在XML空元素
问题描述:
我是很新,XSLT转换,我需要改变一个数据集删除在XML空元素
从数据集的XML看起来像这样
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<Componentstatus>
<tp_ID>1</tp_ID>
<StatusName>Not inspected</StatusName>
<tp_Modified>2012-02-28T10:51:32+01:00</tp_Modified>
<isacute>1</isacute>
</Componentstatus>
<Componentstatus>
<tp_ID>2</tp_ID>
<StatusName>Acute</StatusName>
<tp_Modified>2012-02-28T10:51:40+01:00</tp_Modified>
</Componentstatus>
<Componentstatus>
<tp_ID>3</tp_ID>
<StatusName>See note</StatusName>
<tp_Modified>2012-02-28T10:51:45+01:00</tp_Modified>
</Componentstatus>
<Componentstatus>
<tp_ID>4</tp_ID>
<StatusName>Acceptable</StatusName>
<tp_Modified>2012-02-28T10:52:36+01:00</tp_Modified>
</Componentstatus>
<Componentstatus>
<tp_ID>5</tp_ID>
<StatusName>Action recommended</StatusName>
<tp_Modified>2012-02-28T10:53:07+01:00</tp_Modified>
</Componentstatus>
</NewDataSet>
的XSLT
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://ait.com/componentstatus/">
<xsl:output method="xml" version="4.0" indent="yes" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
<xsl:template match="//NewDataSet" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">z
<ComponentStatusList>
<xsl:for-each select="Componentstatus">
<Status>
<xsl:attribute name="StatusId">
<xsl:value-of select="tp_ID" />
</xsl:attribute>
<StatusName>
<xsl:value-of select="StatusName"/>
</StatusName>
<Acute>
<xsl:value-of select="isacute"/>
</Acute>
</Status>
</xsl:for-each>
</ComponentStatusList>
</xsl:template>
</xsl:stylesheet>
和genarated xml
<?xml version="1.0" encoding="utf-8"?>z
<ComponentStatusList xmlns="http://ait.com/componentstatus/">
<Status StatusId="1">
<StatusName>Not inspected</StatusName>
<Acute>1</Acute>
</Status>
<Status StatusId="2">
<StatusName>Acute</StatusName>
<Acute></Acute>
</Status>
<Status StatusId="3">
<StatusName>See note</StatusName>
<Acute></Acute>
</Status>
<Status StatusId="4">
<StatusName>Acceptable</StatusName>
<Acute></Acute>
</Status>
<Status StatusId="5">
<StatusName>Action recommended</StatusName>
<Acute></Acute>
</Status>
</ComponentStatusList>
正如你所看到的,即使isacute元素丢失,我也会得到一个空的<Acute></Acute>
。如何生成的XML和删除元素在生成的XML如果要素缺失或至少将其设置为<Acute xsi:nil="true" />.
答
一种可能性是简单包装的代码在XSL的相关位:如果声明
<xsl:if test="isacute[.]">
<Acute>
<xsl:value-of select="isacute"/>
</Acute>
</xsl:if>
或者,您可以在此使用模板匹配,如果希望您有多种输出元素的方式,则可以更容易地扩展。
在你的情况,而不是做这个
<Acute>
<xsl:value-of select="isacute"/>
</Acute>
与此
<xsl:apply-templates select="isacute"/>
更换它,然后有模板匹配空和非空的情况下
<xsl:template match="isacute[.]"> <!-- Output element here --> </xsl:template>
<xsl:template match="isacute"/>
这里是完整的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://ait.com/componentstatus/">
<xsl:output method="xml" version="4.0" indent="yes" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
<xsl:template match="//NewDataSet" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<ComponentStatusList>
<xsl:for-each select="Componentstatus">
<Status>
<xsl:attribute name="StatusId">
<xsl:value-of select="tp_ID"/>
</xsl:attribute>
<StatusName>
<xsl:value-of select="StatusName"/>
</StatusName>
<xsl:apply-templates select="isacute"/>
</Status>
</xsl:for-each>
</ComponentStatusList>
</xsl:template>
<xsl:template match="isacute[.]">
<Acute>
<xsl:value-of select="."/>
</Acute>
</xsl:template>
<xsl:template match="isacute"/>
</xsl:stylesheet>
当适用于您的示例XML,下面是输出
<ComponentStatusList xmlns="http://ait.com/componentstatus/">
<Status StatusId="1">
<StatusName>Not inspected</StatusName>
<Acute>1</Acute>
</Status>
<Status StatusId="2">
<StatusName>Acute</StatusName>
</Status>
<Status StatusId="3">
<StatusName>See note</StatusName>
</Status>
<Status StatusId="4">
<StatusName>Acceptable</StatusName>
</Status>
<Status StatusId="5">
<StatusName>Action recommended</StatusName>
</Status>
</ComponentStatusList>
答
试试这个XSLT:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://ait.com/componentstatus/">
<xsl:output method="xml" version="4.0" indent="yes" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
<xsl:template match="//NewDataSet" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<ComponentStatusList>
<xsl:for-each select="Componentstatus">
<xsl:variable name="isacute" select="isacute"/>
<Status>
<xsl:attribute name="StatusId">
<xsl:value-of select="tp_ID" />
</xsl:attribute>
<StatusName>
<xsl:value-of select="StatusName"/>
</StatusName>
<xsl:if test="$isacute!= ''">
<Acute>
<xsl:value-of select="isacute"/>
</Acute>
</xsl:if>
</Status>
</xsl:for-each>
</ComponentStatusList>
</xsl:template>
</xsl:stylesheet>
多亏了你们俩,我很抱歉我只能接受一个答案 – klashagelqvist 2012-03-02 09:41:30