XSL 在调用模板时复制不需要的节点值

XSL copy undesired node value while calling templates

我有这个 XML,我需要对所有节点应用 2 个转换。

<?xml version="1.0" encoding="UTF-8"?>
  <root>
    <a> V1 </a>
    <b> noo </b>
    <a> v2</a>
    <a> v3</a>
    <b>noo</b>
    <a> v4</a>
    <a> v5</a>
    <a> v6</a>
  </root>

这 2 个转换必须按顺序进行:首先全部 "first_transformation",然后全部 "second_transformaiton"。

我用过这个 xsl:

<?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">        
        <xsl:output method='xml' version='1.0' encoding="UTF-8" indent="yes"/>   
        <xsl:template match="/*">
            <xsl:apply-templates mode="t1"/>     
           <xsl:apply-templates mode="t2"/>       
        </xsl:template>   

        <xsl:template match="//a" mode="t1" > 
           <xsl:element name="first_transformation">
               <xsl:value-of select="current()"/>

           </xsl:element>                 
        </xsl:template>

        <xsl:template match="//a" mode="t2" > 
            <xsl:element name="second_transformation">
                <xsl:value-of select="current()"/>

            </xsl:element>                 
        </xsl:template>

    </xsl:stylesheet>

如您所见,我为每个转换使用两个模板,并在 "main" 模板中调用它们。

我的输出是:

<?xml version="1.0" encoding="UTF-8"?>
    <first_transformation> V1 </first_transformation>
     noo 
    <first_transformation> v2</first_transformation>
    <first_transformation> v3</first_transformation>
    noo
    <first_transformation> v4</first_transformation>
    <first_transformation> v5</first_transformation>
    <first_transformation> v6</first_transformation>
    <second_transformation> V1 </second_transformation>
     noo 
    <second_transformation> v2</second_transformation>
    <second_transformation> v3</second_transformation>
    noo
    <second_transformation> v4</second_transformation>
    <second_transformation> v5</second_transformation>
    <second_transformation> v6</second_transformation>

如您所见,我从保持 beein 复制的 b 节点中获得了这些 "noo" 值。

你知道我怎样才能让它们从我的输出中消失吗? 谢谢!

内置模板规则默认复制text()个节点(link):

The built-in rule for any element is to process its child elements and text nodes.

因此您必须为每种模式覆盖此行为。
因此将这两个模板添加到您的样式表中:

<xsl:template match="text()" mode="t1" /> 
<xsl:template match="text()" mode="t2" /> 

这将删除所有多余的 "noo" text() 节点。

或者简单地说:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='xml' version='1.0' encoding="UTF-8" indent="yes"/>   

<xsl:template match="/*">
    <xsl:apply-templates select="a" mode="t1"/>     
    <xsl:apply-templates select="a" mode="t2"/>       
</xsl:template>   

<xsl:template match="a" mode="t1" > 
    <first_transformation>
        <xsl:value-of select="."/>
    </first_transformation>                 
</xsl:template>

<xsl:template match="a" mode="t2" > 
    <second_transformation>
        <xsl:value-of select="."/>
    </second_transformation>                 
</xsl:template>

</xsl:stylesheet>

请注意,结果是一个 XML 片段,因为它没有根元素。