Xml 重用XSL模板以使用不同的相对XPath调用

Xml 重用XSL模板以使用不同的相对XPath调用,xml,xslt,Xml,Xslt,这是我精心设计的例子,说明了我正在努力实现的目标。我有一个输入XML文件,希望将其展平以便进一步处理 输入文件: <BICYCLES> <BICYCLE> <COLOR>BLUE</COLOR> <WHEELS> <WHEEL> <WHEEL_TYPE>FRONT</WHEEL_TYPE>

这是我精心设计的例子,说明了我正在努力实现的目标。我有一个输入XML文件,希望将其展平以便进一步处理

输入文件:

<BICYCLES>
    <BICYCLE>
        <COLOR>BLUE</COLOR>
        <WHEELS>
            <WHEEL>
                <WHEEL_TYPE>FRONT</WHEEL_TYPE>
                <FLAT>NO</FLAT>
                <REFLECTORS>
                    <REFLECTOR>
                        <REFLECTOR_NUM>1</REFLECTOR_NUM>
                        <SHAPE>SQUARE</SHAPE>
                    </REFLECTOR>
                    <REFLECTOR>
                        <REFLECTOR_NUM>2</REFLECTOR_NUM>
                        <SHAPE>ROUND</SHAPE>
                    </REFLECTOR>
                </REFLECTORS>
            </WHEEL>
            <WHEEL>
                <WHEEL_TYPE>REAR</WHEEL_TYPE>
                <FLAT>NO</FLAT>
            </WHEEL>
        </WHEELS>
    </BICYCLE>
</BICYCLES>

蓝色
正面
不
1.
广场
2.
圆形的
后方的
不
输入是
节点的列表。每个
都有一个
,并且可以选择有

节点的列表,每个节点都有一些属性,并且可以选择具有

节点的列表,每个节点都有一些属性

我们的目标是使这个XML平坦化。这是我正在使用的XSL:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" xml:space="preserve"/> 

<xsl:template match="/">
<BICYCLES>
<xsl:apply-templates/>
</BICYCLES>
</xsl:template>

<xsl:template match="BICYCLE">
<xsl:choose>
    <xsl:when test="WHEELS">
        <xsl:apply-templates select="WHEELS"/>
    </xsl:when>
    <xsl:otherwise>
        <BICYCLE>
            <COLOR><xsl:value-of select="COLOR"/></COLOR>
            <WHEEL_TYPE/>
            <FLAT/>
            <REFLECTOR_NUM/>
            <SHAPE/>
        </BICYCLE>
    </xsl:otherwise>
</xsl:choose>
</xsl:template>

<xsl:template match="WHEELS">
<xsl:apply-templates select="WHEEL"/>
</xsl:template>

<xsl:template match="WHEEL">
    <xsl:choose>
        <xsl:when test="REFLECTORS">
            <xsl:apply-templates select="REFLECTORS"/>
        </xsl:when>
        <xsl:otherwise>
            <BICYCLE>
                <COLOR><xsl:value-of select="../../COLOR"/></COLOR>
                <WHEEL_TYPE><xsl:value-of select="WHEEL_TYPE"/></WHEEL_TYPE>
                <FLAT><xsl:value-of select="FLAT"/></FLAT>
                <REFLECTOR_NUM/>
                <SHAPE/>
            </BICYCLE>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template match="REFLECTORS">
    <xsl:apply-templates select="REFLECTOR"/>
</xsl:template>

<xsl:template match="REFLECTOR"> 
    <BICYCLE>
        <COLOR><xsl:value-of select="../../../../COLOR"/></COLOR>
        <WHEEL_TYPE><xsl:value-of select="../../WHEEL_TYPE"/></WHEEL_TYPE>
        <FLAT><xsl:value-of select="../../FLAT"/></FLAT>
        <REFLECTOR_NUM><xsl:value-of select="REFLECTOR_NUM"/></REFLECTOR_NUM>
        <SHAPE><xsl:value-of select="SHAPE"/></SHAPE>
    </BICYCLE>
</xsl:template>

</xsl:stylesheet>

输出为:

<BICYCLES xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <BICYCLE>
        <COLOR>BLUE</COLOR>
        <WHEEL_TYPE>FRONT</WHEEL_TYPE>
        <FLAT>NO</FLAT>
        <REFLECTOR_NUM>1</REFLECTOR_NUM>
        <SHAPE>SQUARE</SHAPE>
    </BICYCLE>
    <BICYCLE>
        <COLOR>BLUE</COLOR>
        <WHEEL_TYPE>FRONT</WHEEL_TYPE>
        <FLAT>NO</FLAT>
        <REFLECTOR_NUM>2</REFLECTOR_NUM>
        <SHAPE>ROUND</SHAPE>
    </BICYCLE>
    <BICYCLE>
        <COLOR>BLUE</COLOR>
        <WHEEL_TYPE>REAR</WHEEL_TYPE>
        <FLAT>NO</FLAT>
        <REFLECTOR_NUM/>
        <SHAPE/>
    </BICYCLE>
</BICYCLES>

蓝色
正面
不
1.
广场
蓝色
正面
不
2.
圆形的
蓝色
后方的
不
我不喜欢的是,我以几种形式输出颜色属性:

<COLOR><xsl:value-of select="../../../../COLOR"/></COLOR>
<COLOR><xsl:value-of select="../../COLOR"/></COLOR>
<COLOR><xsl:value-of select="COLOR"/></COLOR>
<COLOR/>

似乎应该有一种方法来创建一个命名模板,从需要它的各个地方调用它,并将一些表示路径的参数传递回它所引用的
节点

有没有办法清理这个问题,比如用自行车场、车轮场和反射器场的命名模板


在实际示例中,这是基于“bicycle”的,它的属性远不止颜色,我想使XSL易于更改,以包含或排除字段,而无需在多个位置更改XSL。

您可以使用
name
属性来命名模板。您可以使用按名称调用模板,只要
有效,模板就有效(IIRC)


更新(来自评论):听起来你想要一个不同的祖先,可能是
。类似于
祖先::bicycle/color

您可以使用
name
属性来命名模板。您可以使用按名称调用模板,只要
有效,模板就有效(IIRC)

更新(来自评论):听起来你想要一个不同的祖先,可能是
。类似于祖先的东西:自行车/颜色你的意思是:

<xsl:template name="wheelblock">
  <xsl:param name="color"></xsl:param>
  <!-- Do something here -->
</xsl:template>

<xsl:template match="WHEEL">
  <xsl:call-template name="wheelblock">
    <xsl:with-param name="color">whatever element/etc</xsl:with-param>
  </xsl:call-template>
</xsl:template>

任何元素/等
你的意思是:

<xsl:template name="wheelblock">
  <xsl:param name="color"></xsl:param>
  <!-- Do something here -->
</xsl:template>

<xsl:template match="WHEEL">
  <xsl:call-template name="wheelblock">
    <xsl:with-param name="color">whatever element/etc</xsl:with-param>
  </xsl:call-template>
</xsl:template>

任何元素/等
我不喜欢的是 我正在输出中的颜色属性 几种形式:

<COLOR><xsl:value-of select="../../../../COLOR"/></COLOR>
<COLOR><xsl:value-of select="../../COLOR"/></COLOR>
<COLOR><xsl:value-of select="COLOR"/></COLOR>
<COLOR/>
信息技术 看来应该有办法 创建一个命名模板并调用它 从它所在的各个地方 需要并传递一些参数 表示返回的路径 它所引用的节点

比如说,有没有办法清理一下 使用自行车的命名模板 字段,用于控制盘字段和 反射器场

您可以实现比这更多的重用

原则是避免条件逻辑,让XSLT处理器选择要处理的模板。任何需要的值都应作为参数沿路径传递给应用的模板

以下转换演示了这些原则:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="BICYCLE">
  <xsl:apply-templates>
    <xsl:with-param name="pColor" select="COLOR"/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="BICYCLE[not(WHEELS)]">
    <BICYCLE>
        <COLOR><xsl:value-of select="COLOR"/></COLOR>
        <WHEEL_TYPE/>
        <FLAT/>
        <REFLECTOR_NUM/>
        <COLOR/>
        <SHAPE/>
    </BICYCLE>
 </xsl:template>

 <xsl:template match="WHEELS">
   <xsl:param name="pColor"/>

   <xsl:apply-templates>
    <xsl:with-param name="pColor" select="$pColor"/>
   </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="WHEEL[REFLECTORS]">
   <xsl:param name="pColor"/>

   <xsl:apply-templates select="REFLECTORS">
    <xsl:with-param name="pColor" select="$pColor"/>
    <xsl:with-param name="pWheel_Type" select="WHEEL_TYPE"/>
    <xsl:with-param name="pFlat" select="FLAT"/>
   </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="WHEEL">
   <xsl:param name="pColor"/>

    <BICYCLE>
        <COLOR><xsl:value-of select="$pColor"/></COLOR>
        <WHEEL_TYPE><xsl:value-of select="WHEEL_TYPE"/></WHEEL_TYPE>
        <FLAT><xsl:value-of select="FLAT"/></FLAT>
        <REFLECTOR_NUM/>
        <COLOR/>
        <SHAPE/>
    </BICYCLE>
 </xsl:template>

 <xsl:template match="REFLECTORS">
  <xsl:param name="pColor"/>
  <xsl:param name="pWheel_Type"/>
  <xsl:param name="pFlat"/>

  <xsl:apply-templates select="REFLECTOR">
    <xsl:with-param name="pColor" select="$pColor"/>
    <xsl:with-param name="pWheel_Type" select="$pWheel_Type"/>
    <xsl:with-param name="pFlat" select="$pFlat"/>
  </xsl:apply-templates>
</xsl:template>

 <xsl:template match="REFLECTOR">
  <xsl:param name="pColor"/>
  <xsl:param name="pWheel_Type"/>
  <xsl:param name="pFlat"/>

    <BICYCLE>
        <COLOR><xsl:value-of select="$pColor"/></COLOR>
        <WHEEL_TYPE><xsl:value-of select="$pWheel_Type"/></WHEEL_TYPE>
        <FLAT><xsl:value-of select="$pFlat"/></FLAT>
        <REFLECTOR_NUM><xsl:value-of select="REFLECTOR_NUM"/></REFLECTOR_NUM>
        <COLOR><xsl:value-of select="COLOR"/></COLOR>
        <SHAPE><xsl:value-of select="SHAPE"/></SHAPE>
    </BICYCLE>
 </xsl:template>

 <xsl:template match="BICYCLE/COLOR"/>
</xsl:stylesheet>
<BICYCLES>
 <BICYCLE>
  <COLOR>BLUE</COLOR>
  <WHEEL_TYPE>FRONT</WHEEL_TYPE>
  <FLAT>NO</FLAT>
  <REFLECTOR_NUM>1</REFLECTOR_NUM>
  <COLOR>RED</COLOR>
  <SHAPE>SQUARE</SHAPE>
 </BICYCLE>
 <BICYCLE>
  <COLOR>BLUE</COLOR>
  <WHEEL_TYPE>FRONT</WHEEL_TYPE>
  <FLAT>NO</FLAT>
  <REFLECTOR_NUM>2</REFLECTOR_NUM>
  <COLOR>WHITE</COLOR>
  <SHAPE>ROUND</SHAPE>
 </BICYCLE>
 <BICYCLE>
  <COLOR>BLUE</COLOR>
  <WHEEL_TYPE>REAR</WHEEL_TYPE>
  <FLAT>NO</FLAT>
  <REFLECTOR_NUM/>
  <COLOR/>
  <SHAPE/>
 </BICYCLE>
</BICYCLES>

应用于提供的XML文档时,将生成所需的结果

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="BICYCLE">
  <xsl:apply-templates>
    <xsl:with-param name="pColor" select="COLOR"/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="BICYCLE[not(WHEELS)]">
    <BICYCLE>
        <COLOR><xsl:value-of select="COLOR"/></COLOR>
        <WHEEL_TYPE/>
        <FLAT/>
        <REFLECTOR_NUM/>
        <COLOR/>
        <SHAPE/>
    </BICYCLE>
 </xsl:template>

 <xsl:template match="WHEELS">
   <xsl:param name="pColor"/>

   <xsl:apply-templates>
    <xsl:with-param name="pColor" select="$pColor"/>
   </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="WHEEL[REFLECTORS]">
   <xsl:param name="pColor"/>

   <xsl:apply-templates select="REFLECTORS">
    <xsl:with-param name="pColor" select="$pColor"/>
    <xsl:with-param name="pWheel_Type" select="WHEEL_TYPE"/>
    <xsl:with-param name="pFlat" select="FLAT"/>
   </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="WHEEL">
   <xsl:param name="pColor"/>

    <BICYCLE>
        <COLOR><xsl:value-of select="$pColor"/></COLOR>
        <WHEEL_TYPE><xsl:value-of select="WHEEL_TYPE"/></WHEEL_TYPE>
        <FLAT><xsl:value-of select="FLAT"/></FLAT>
        <REFLECTOR_NUM/>
        <COLOR/>
        <SHAPE/>
    </BICYCLE>
 </xsl:template>

 <xsl:template match="REFLECTORS">
  <xsl:param name="pColor"/>
  <xsl:param name="pWheel_Type"/>
  <xsl:param name="pFlat"/>

  <xsl:apply-templates select="REFLECTOR">
    <xsl:with-param name="pColor" select="$pColor"/>
    <xsl:with-param name="pWheel_Type" select="$pWheel_Type"/>
    <xsl:with-param name="pFlat" select="$pFlat"/>
  </xsl:apply-templates>
</xsl:template>

 <xsl:template match="REFLECTOR">
  <xsl:param name="pColor"/>
  <xsl:param name="pWheel_Type"/>
  <xsl:param name="pFlat"/>

    <BICYCLE>
        <COLOR><xsl:value-of select="$pColor"/></COLOR>
        <WHEEL_TYPE><xsl:value-of select="$pWheel_Type"/></WHEEL_TYPE>
        <FLAT><xsl:value-of select="$pFlat"/></FLAT>
        <REFLECTOR_NUM><xsl:value-of select="REFLECTOR_NUM"/></REFLECTOR_NUM>
        <COLOR><xsl:value-of select="COLOR"/></COLOR>
        <SHAPE><xsl:value-of select="SHAPE"/></SHAPE>
    </BICYCLE>
 </xsl:template>

 <xsl:template match="BICYCLE/COLOR"/>
</xsl:stylesheet>
<BICYCLES>
 <BICYCLE>
  <COLOR>BLUE</COLOR>
  <WHEEL_TYPE>FRONT</WHEEL_TYPE>
  <FLAT>NO</FLAT>
  <REFLECTOR_NUM>1</REFLECTOR_NUM>
  <COLOR>RED</COLOR>
  <SHAPE>SQUARE</SHAPE>
 </BICYCLE>
 <BICYCLE>
  <COLOR>BLUE</COLOR>
  <WHEEL_TYPE>FRONT</WHEEL_TYPE>
  <FLAT>NO</FLAT>
  <REFLECTOR_NUM>2</REFLECTOR_NUM>
  <COLOR>WHITE</COLOR>
  <SHAPE>ROUND</SHAPE>
 </BICYCLE>
 <BICYCLE>
  <COLOR>BLUE</COLOR>
  <WHEEL_TYPE>REAR</WHEEL_TYPE>
  <FLAT>NO</FLAT>
  <REFLECTOR_NUM/>
  <COLOR/>
  <SHAPE/>
 </BICYCLE>
</BICYCLES>

蓝色
正面
不
1.
红色
广场
蓝色
正面
不
2.
白色
圆形的
蓝色
后方的
不
我不喜欢的是 我正在输出中的颜色属性 几种形式:

<COLOR><xsl:value-of select="../../../../COLOR"/></COLOR>
<COLOR><xsl:value-of select="../../COLOR"/></COLOR>
<COLOR><xsl:value-of select="COLOR"/></COLOR>
<COLOR/>
信息技术 看来应该有办法 创建一个命名模板并调用它 从它所在的各个地方 需要并传递一些参数 表示返回的路径 它所引用的节点

比如说,有没有办法清理一下 使用自行车的命名模板 字段,用于控制盘字段和 反射器场

您可以实现比这更多的重用

原则是避免条件逻辑,让XSLT处理器选择要处理的模板。任何需要的值都应作为参数沿路径传递给应用的模板

以下转换演示了这些原则:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="BICYCLE">
  <xsl:apply-templates>
    <xsl:with-param name="pColor" select="COLOR"/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="BICYCLE[not(WHEELS)]">
    <BICYCLE>
        <COLOR><xsl:value-of select="COLOR"/></COLOR>
        <WHEEL_TYPE/>
        <FLAT/>
        <REFLECTOR_NUM/>
        <COLOR/>
        <SHAPE/>
    </BICYCLE>
 </xsl:template>

 <xsl:template match="WHEELS">
   <xsl:param name="pColor"/>

   <xsl:apply-templates>
    <xsl:with-param name="pColor" select="$pColor"/>
   </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="WHEEL[REFLECTORS]">
   <xsl:param name="pColor"/>

   <xsl:apply-templates select="REFLECTORS">
    <xsl:with-param name="pColor" select="$pColor"/>
    <xsl:with-param name="pWheel_Type" select="WHEEL_TYPE"/>
    <xsl:with-param name="pFlat" select="FLAT"/>
   </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="WHEEL">
   <xsl:param name="pColor"/>

    <BICYCLE>
        <COLOR><xsl:value-of select="$pColor"/></COLOR>
        <WHEEL_TYPE><xsl:value-of select="WHEEL_TYPE"/></WHEEL_TYPE>
        <FLAT><xsl:value-of select="FLAT"/></FLAT>
        <REFLECTOR_NUM/>
        <COLOR/>
        <SHAPE/>
    </BICYCLE>
 </xsl:template>

 <xsl:template match="REFLECTORS">
  <xsl:param name="pColor"/>
  <xsl:param name="pWheel_Type"/>
  <xsl:param name="pFlat"/>

  <xsl:apply-templates select="REFLECTOR">
    <xsl:with-param name="pColor" select="$pColor"/>
    <xsl:with-param name="pWheel_Type" select="$pWheel_Type"/>
    <xsl:with-param name="pFlat" select="$pFlat"/>
  </xsl:apply-templates>
</xsl:template>

 <xsl:template match="REFLECTOR">
  <xsl:param name="pColor"/>
  <xsl:param name="pWheel_Type"/>
  <xsl:param name="pFlat"/>

    <BICYCLE>
        <COLOR><xsl:value-of select="$pColor"/></COLOR>
        <WHEEL_TYPE><xsl:value-of select="$pWheel_Type"/></WHEEL_TYPE>
        <FLAT><xsl:value-of select="$pFlat"/></FLAT>
        <REFLECTOR_NUM><xsl:value-of select="REFLECTOR_NUM"/></REFLECTOR_NUM>
        <COLOR><xsl:value-of select="COLOR"/></COLOR>
        <SHAPE><xsl:value-of select="SHAPE"/></SHAPE>
    </BICYCLE>
 </xsl:template>

 <xsl:template match="BICYCLE/COLOR"/>
</xsl:stylesheet>
<BICYCLES>
 <BICYCLE>
  <COLOR>BLUE</COLOR>
  <WHEEL_TYPE>FRONT</WHEEL_TYPE>
  <FLAT>NO</FLAT>
  <REFLECTOR_NUM>1</REFLECTOR_NUM>
  <COLOR>RED</COLOR>
  <SHAPE>SQUARE</SHAPE>
 </BICYCLE>
 <BICYCLE>
  <COLOR>BLUE</COLOR>
  <WHEEL_TYPE>FRONT</WHEEL_TYPE>
  <FLAT>NO</FLAT>
  <REFLECTOR_NUM>2</REFLECTOR_NUM>
  <COLOR>WHITE</COLOR>
  <SHAPE>ROUND</SHAPE>
 </BICYCLE>
 <BICYCLE>
  <COLOR>BLUE</COLOR>
  <WHEEL_TYPE>REAR</WHEEL_TYPE>
  <FLAT>NO</FLAT>
  <REFLECTOR_NUM/>
  <COLOR/>
  <SHAPE/>
 </BICYCLE>
</BICYCLES>

应用于提供的XML文档时,将生成所需的结果

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="BICYCLE">
  <xsl:apply-templates>
    <xsl:with-param name="pColor" select="COLOR"/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="BICYCLE[not(WHEELS)]">
    <BICYCLE>
        <COLOR><xsl:value-of select="COLOR"/></COLOR>
        <WHEEL_TYPE/>
        <FLAT/>
        <REFLECTOR_NUM/>
        <COLOR/>
        <SHAPE/>
    </BICYCLE>
 </xsl:template>

 <xsl:template match="WHEELS">
   <xsl:param name="pColor"/>

   <xsl:apply-templates>
    <xsl:with-param name="pColor" select="$pColor"/>
   </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="WHEEL[REFLECTORS]">
   <xsl:param name="pColor"/>

   <xsl:apply-templates select="REFLECTORS">
    <xsl:with-param name="pColor" select="$pColor"/>
    <xsl:with-param name="pWheel_Type" select="WHEEL_TYPE"/>
    <xsl:with-param name="pFlat" select="FLAT"/>
   </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="WHEEL">
   <xsl:param name="pColor"/>

    <BICYCLE>
        <COLOR><xsl:value-of select="$pColor"/></COLOR>
        <WHEEL_TYPE><xsl:value-of select="WHEEL_TYPE"/></WHEEL_TYPE>
        <FLAT><xsl:value-of select="FLAT"/></FLAT>
        <REFLECTOR_NUM/>
        <COLOR/>
        <SHAPE/>
    </BICYCLE>
 </xsl:template>

 <xsl:template match="REFLECTORS">
  <xsl:param name="pColor"/>
  <xsl:param name="pWheel_Type"/>
  <xsl:param name="pFlat"/>

  <xsl:apply-templates select="REFLECTOR">
    <xsl:with-param name="pColor" select="$pColor"/>
    <xsl:with-param name="pWheel_Type" select="$pWheel_Type"/>
    <xsl:with-param name="pFlat" select="$pFlat"/>
  </xsl:apply-templates>
</xsl:template>

 <xsl:template match="REFLECTOR">
  <xsl:param name="pColor"/>
  <xsl:param name="pWheel_Type"/>
  <xsl:param name="pFlat"/>

    <BICYCLE>
        <COLOR><xsl:value-of select="$pColor"/></COLOR>
        <WHEEL_TYPE><xsl:value-of select="$pWheel_Type"/></WHEEL_TYPE>
        <FLAT><xsl:value-of select="$pFlat"/></FLAT>
        <REFLECTOR_NUM><xsl:value-of select="REFLECTOR_NUM"/></REFLECTOR_NUM>
        <COLOR><xsl:value-of select="COLOR"/></COLOR>
        <SHAPE><xsl:value-of select="SHAPE"/></SHAPE>
    </BICYCLE>
 </xsl:template>

 <xsl:template match="BICYCLE/COLOR"/>
</xsl:stylesheet>
<BICYCLES>
 <BICYCLE>
  <COLOR>BLUE</COLOR>
  <WHEEL_TYPE>FRONT</WHEEL_TYPE>
  <FLAT>NO</FLAT>
  <REFLECTOR_NUM>1</REFLECTOR_NUM>
  <COLOR>RED</COLOR>
  <SHAPE>SQUARE</SHAPE>
 </BICYCLE>
 <BICYCLE>
  <COLOR>BLUE</COLOR>
  <WHEEL_TYPE>FRONT</WHEEL_TYPE>
  <FLAT>NO</FLAT>
  <REFLECTOR_NUM>2</REFLECTOR_NUM>
  <COLOR>WHITE</COLOR>
  <SHAPE>ROUND</SHAPE>
 </BICYCLE>
 <BICYCLE>
  <COLOR>BLUE</COLOR>
  <WHEEL_TYPE>REAR</WHEEL_TYPE>
  <FLAT>NO</FLAT>
  <REFLECTOR_NUM/>
  <COLOR/>
  <SHAPE/>
 </BICYCLE>
</BICYCLES>

蓝色
正面
不
1.
红色
广场
蓝色
正面
不
2.
白色