XSL apply-templates 也适用于不匹配的元素

XSL apply-templates works with not matching elements too

我有一个输入 Xml 比如:

<?xml version="1.0" encoding="UTF-8"?>
<Merge>
   <Object>
      <Value name="Name" type="Number">Hans</Value>
      <Value name="Vorname" type="Number">Peter</Value>
      <Value name="Gebort" type="Number">Germany</Value>
   </Object>
   <Data>
      <getGender>
         <get_Gender>male</get_Gender>
      </getGender>
   </Data>
</Merge>

还有像这样的 xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output media-type="text/xml" method="xml"></xsl:output>
  <xsl:template match="/">
    <Features>
        <xsl:apply-templates></xsl:apply-templates>
        <Feature name="gender"><xsl:value-of select="//get_Gender"></xsl:value-of></Feature>
    </Features>
  </xsl:template>
  
  <xsl:template match="Value">
     <Feature name="{@name}"><xsl:value-of select="."></xsl:value-of></Feature>
  </xsl:template>
</xsl:stylesheet>

我的输出是:

<Features>
   
      <Feature name="Name">Hans</Feature>
      <Feature name="Vorname">Peter</Feature>
      <Feature name="Gebort">Germany</Feature>
   
   
      
         male
      
   
<Feature name="gender">male</Feature>
</Features>

但是为什么?? 我想要类似的东西:

<Features>
      <Feature name="Name">Hans</Feature>
      <Feature name="Vorname">Peter</Feature>
      <Feature name="Gebort">Germany</Feature>
      <Feature name="gender">male</Feature>
</Features>

为什么我的输出中出现这个随机的“男性”,我认为这与 <apply-templates> 但我不知道为什么它会这样。

有内置模板可以通过 <xsl:apply-templates></xsl:apply-templates> 输出文本节点,您可以递归地处理该级别的所有子节点,因此 <xsl:apply-templates select="Merge/Object"/> 或确保您有一个空的 <xsl:template match="get_Gender"/>.

除非您正在做与示例所示不同的事情,否则您也可以删除模板应用程序并直接遍历节点:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output media-type="text/xml" method="xml"></xsl:output>
<xsl:template match="/">
<Features>
<xsl:for-each select="Merge/Object/Value">
<Feature name="{@name}"><xsl:value-of select="."></xsl:value-of>
</Feature>
</xsl:for-each>
<Feature name="gender"><xsl:value-of select="Merge/Data/getGender/get_Gender"/>
</Feature>
</Features>
</xsl:template>
</xsl:stylesheet>