使用XSLT去除EMPTY数据元素

时间:2014-02-21 17:17:50

标签: xml xslt

在我的工作流程中,我将XML导入InDesign。使用最多四个单独的数据线捕获地址信息。第3行和第4行通常都是空白但我在布局中得到了额外的段落返回,因为XML包含如下所示的EMPTY元素:<HomeAddrLine4 />

过去,我使用模板在每个元素上完全忽略空元素。但是我当前的工作流程将模板应用于整个父元素。有没有办法忽略模板中的单个元素而不必重写我的整个XSLT?

这是XSLT模板(截断)。如果您需要更多XSLT,请告诉我们:

 ...
 <xsl:template match="Consultant">
 <consultant><Surname><xsl:value-of select="Surname"/></Surname>
 <FirstName><xsl:value-of select="FirstName"/></FirstName>
 <HomeAddrLine1><xsl:value-of select="HomeAddrLine1"/></HomeAddrLine1>
 <HomeAddrLine2><xsl:value-of select="HomeAddrLine2[string-length() != 0]"/></HomeAddrLine2>
 <HomeAddrLine3><xsl:value-of select="HomeAddrLine3[string-length() != 0]"/></HomeAddrLine3>
 <HomeAddrLine4><xsl:value-of select="HomeAddrLine4[string-length() != 0]"/></HomeAddrLine4>
 </consultant>
 </xsl:template>
 </xsl:stylesheet>

2 个答案:

答案 0 :(得分:0)

您可能希望在元素上使用xsl:if来检查值:

<xsl:if test="HomeAddrLine2[. != '']">
<HomeAddrLine2><xsl:value-of select="HomeAddrLine2"/></HomeAddrLine2>
</xsl:if>

答案 1 :(得分:0)

你的模板没有多大意义。您正在创建与现有元素完全相同的新元素。 (例如:<HomeAddrLine1><xsl:value-of select="HomeAddrLine1"/></HomeAddrLine1>

如果你没有改变什么,也许xsl:copy-of可能是更好的选择:

<xsl:copy-of select="*[starts-with(local-name(),'HomeAddrLine') and string()]"/>

包含SurnameFirstName的另一个示例:

<xsl:copy-of select="Surname|FirstName|*[starts-with(local-name(),'HomeAddrLine') and string()]"/>

<xsl:copy-of select="(Surname|FirstName|*[starts-with(local-name(),'HomeAddrLine')])[string()]"/>

Consultant所有孩子的一个例子:

<xsl:copy-of select="*[string()]"/>