在我的工作流程中,我将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>
答案 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()]"/>
包含Surname
和FirstName
的另一个示例:
<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()]"/>