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"/>