XSLT:省略不必要的文本
XSLT: Leaving out unnecessary text
使用这个内置模板:
<xsl:template match="text()|@*"/>
我试图省略所有不会出现在输出 XML 元素中的文本。
它适用于大部分代码,但不适用于这部分代码:
<xsl:template match="NAD_01">
<xsl:variable name="a" select="NAD_01_3035"/>
<xsl:if test="$a='BY'">
<xsl:apply-templates mode="BY"/>
</xsl:if>
<xsl:if test="$a='SE'">
<xsl:apply-templates mode="SE"/>
</xsl:if>
<xsl:if test="$a='ST'">
<xsl:apply-templates mode="ST"/>
</xsl:if>
</xsl:template>
<xsl:template match="NAD_01_C080" mode="SE">
<E1EDKA1>
<PARVW>LF</PARVW>
<xsl:if test="exists(NAD_01_3036_01)">
<NAME1><xsl:value-of select="NAD_01_3036_01"/></NAME1>
</xsl:if>
<xsl:if test="exists(NAD_01_3036_02)">
<NAME1><xsl:value-of select="NAD_01_3036_02"/></NAME1>
</xsl:if>
<xsl:if test="exists(NAD_01_3036_03)">
<NAME1><xsl:value-of select="NAD_01_3036_03"/></NAME1>
</xsl:if>
<xsl:if test="exists(NAD_01_3036_04)">
<NAME1><xsl:value-of select="NAD_01_3036_04"/></NAME1>
</xsl:if>
</E1EDKA1>
</xsl:template>
<xsl:template match="NAD_01_C082" mode="BY">
<EDIDC>
<SNDRPRN><xsl:value-of select="NAD_01_3039"/></SNDRPRN>
</EDIDC>
</xsl:template>
<xsl:template match="NAD_01_C082" mode="SE">
<EDIDC>
<RVNPRN><xsl:value-of select="NAD_01_3039"/></RVNPRN>
</EDIDC>
</xsl:template>
<xsl:template match="NAD_01_C082" mode="ST">
<E1EDKA1>
<PARVW>WE</PARVW>
<PARTN><xsl:value-of select="NAD_01_3039"/></PARTN>
</E1EDKA1>
</xsl:template>
"NAD_01" 部分及其子元素(例如 "NAD_01_3039" 中的输入元素中的文本,但不同的元素没有任何输出元素)保留在输出中。
我不知道问题出在哪里。也许用变量,也许用模式链接...
请问,即使在 "NAD_01" 部分,我怎样才能省去所有不必要的文字?
谢谢。
您提供的模板,
<xsl:template match="text()|@*"/>
不会肯定地抑制文本或属性节点。它仅表示此类节点的转换,应用时,什么也不产生。如果您在结果文档中得到不需要的文本节点,那是因为在其他模板中表达的规则具有比该模板更高的优先级,或者匹配不同的节点,或者以不同的模式运行。
无法为您的 XSL 片段和完全未指定的输入文档给出明确的答案,但仅在您提供的内容中我观察到
- 您使用了多种模式,您提供的无转换模板仅适用于默认模式。
- 您正在使用
<xsl:value-of>
元素从输入文档元素创建输出文本节点。元素节点的字符串值是其所有文本节点后代的字符串值的串联,很可能包含不需要的文本节点。
确保为任何使用的模式单独添加该模板:
<xsl:template match="text()" mode="BY"/>
<xsl:template match="text()" mode="SE"/>
<xsl:template match="text()" mode="ST"/>
使用这个内置模板:
<xsl:template match="text()|@*"/>
我试图省略所有不会出现在输出 XML 元素中的文本。
它适用于大部分代码,但不适用于这部分代码:
<xsl:template match="NAD_01">
<xsl:variable name="a" select="NAD_01_3035"/>
<xsl:if test="$a='BY'">
<xsl:apply-templates mode="BY"/>
</xsl:if>
<xsl:if test="$a='SE'">
<xsl:apply-templates mode="SE"/>
</xsl:if>
<xsl:if test="$a='ST'">
<xsl:apply-templates mode="ST"/>
</xsl:if>
</xsl:template>
<xsl:template match="NAD_01_C080" mode="SE">
<E1EDKA1>
<PARVW>LF</PARVW>
<xsl:if test="exists(NAD_01_3036_01)">
<NAME1><xsl:value-of select="NAD_01_3036_01"/></NAME1>
</xsl:if>
<xsl:if test="exists(NAD_01_3036_02)">
<NAME1><xsl:value-of select="NAD_01_3036_02"/></NAME1>
</xsl:if>
<xsl:if test="exists(NAD_01_3036_03)">
<NAME1><xsl:value-of select="NAD_01_3036_03"/></NAME1>
</xsl:if>
<xsl:if test="exists(NAD_01_3036_04)">
<NAME1><xsl:value-of select="NAD_01_3036_04"/></NAME1>
</xsl:if>
</E1EDKA1>
</xsl:template>
<xsl:template match="NAD_01_C082" mode="BY">
<EDIDC>
<SNDRPRN><xsl:value-of select="NAD_01_3039"/></SNDRPRN>
</EDIDC>
</xsl:template>
<xsl:template match="NAD_01_C082" mode="SE">
<EDIDC>
<RVNPRN><xsl:value-of select="NAD_01_3039"/></RVNPRN>
</EDIDC>
</xsl:template>
<xsl:template match="NAD_01_C082" mode="ST">
<E1EDKA1>
<PARVW>WE</PARVW>
<PARTN><xsl:value-of select="NAD_01_3039"/></PARTN>
</E1EDKA1>
</xsl:template>
"NAD_01" 部分及其子元素(例如 "NAD_01_3039" 中的输入元素中的文本,但不同的元素没有任何输出元素)保留在输出中。
我不知道问题出在哪里。也许用变量,也许用模式链接...
请问,即使在 "NAD_01" 部分,我怎样才能省去所有不必要的文字?
谢谢。
您提供的模板,
<xsl:template match="text()|@*"/>
不会肯定地抑制文本或属性节点。它仅表示此类节点的转换,应用时,什么也不产生。如果您在结果文档中得到不需要的文本节点,那是因为在其他模板中表达的规则具有比该模板更高的优先级,或者匹配不同的节点,或者以不同的模式运行。
无法为您的 XSL 片段和完全未指定的输入文档给出明确的答案,但仅在您提供的内容中我观察到
- 您使用了多种模式,您提供的无转换模板仅适用于默认模式。
- 您正在使用
<xsl:value-of>
元素从输入文档元素创建输出文本节点。元素节点的字符串值是其所有文本节点后代的字符串值的串联,很可能包含不需要的文本节点。
确保为任何使用的模式单独添加该模板:
<xsl:template match="text()" mode="BY"/>
<xsl:template match="text()" mode="SE"/>
<xsl:template match="text()" mode="ST"/>