首页 > 解决方案 > XSL 在调用模板时复制不需要的节点值

问题描述

我有这个 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>

这两个转换必须按顺序产生:首先是所有“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>

如您所见,我为每个转换使用两个模板,并将它们称为“主”模板。

我的输出是:

<?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>

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

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

标签: xmlxsltxslt-2.0

解决方案


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

任何元素的内置规则是处理其子元素和文本节点。

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

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

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


推荐阅读