XSLT:省去不必要的文本

时间:2017-04-04 17:33:43

标签: xml xslt text output built-in

使用此内置模板:

<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”部分,我怎么能省去所有不必要的文字?

谢谢。

2 个答案:

答案 0 :(得分:3)

您出示的模板,

<xsl:template match="text()|@*"/>

不肯定地压缩文本或属性节点。它只是表达了这样的节点的转换,在应用时什么都不产生。如果您在结果文档中获得了不需要的文本节点,那么这是因为在某个其他模板中表达的规则要么具有比该规则更高的优先级,要么匹配不同的节点,或者以不同的模式运行。

对于您的XSL片段和完全未指定的输入文档,不能给出确定的答案,但只是在您所呈现的内容中我观察到

  • 您正在使用多种模式,并且您提供的转换为空模板仅适用于默认模式。
  • 您正在使用<xsl:value-of>元素从输入文档元素创建输出文本节点。元素节点的字符串值是其所有文本节点后代的字符串值的串联,其中可能包含不需要的文本节点。

答案 1 :(得分:0)

确保为任何使用的模式单独添加该模板:

<xsl:template match="text()" mode="BY"/>
<xsl:template match="text()" mode="SE"/>
<xsl:template match="text()" mode="ST"/>