XSL应用模板也适用于不匹配的元素[重复]

Posted

技术标签:

【中文标题】XSL应用模板也适用于不匹配的元素[重复]【英文标题】:XSL apply-templates works with not matching elements too [duplicate] 【发布时间】:2022-01-08 17:58:52 【问题描述】:

我有一个输入 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>

为什么我的输出中有这个随机的“男性”,我认为这与 &lt;apply-templates&gt; 但我不知道为什么会这样。

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

除非您做的不是示例显示的内容,否则您也可以删除模板应用程序并直接遍历节点:

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

【讨论】:

以上是关于XSL应用模板也适用于不匹配的元素[重复]的主要内容,如果未能解决你的问题,请参考以下文章

XSLT3 未命名的 xsl:mode on-no-match 行为是不是应该应用于没有模式匹配但模式在应用模板上指定的元素?

ui-template

如何使用 XSL-FO(和 Apache FOP)计算从应用模板返回的元素

用XPath精确定位节点元素&selenium使用Xpath定位之完整篇

用XPath精确定位节点元素&selenium使用Xpath定位之完整篇

XSL xsl:模板匹配="/"