在同一级别为同一XML元素呈现不同的模板

在同一级别为同一XML元素呈现不同的模板,xml,templates,xslt,apply-templates,Xml,Templates,Xslt,Apply Templates,XML: el1 el2 el1 el2 正在尝试为同一元素生成并应用两个不同的模板 主模板: <Root> <Elements> <Element>el1</Element> <Element>el2</Element> </Elements> <Elements> <Element>el1</Element> <El

XML:


el1
el2
el1
el2
正在尝试为同一元素生成并应用两个不同的模板

主模板:

<Root>
  <Elements>
    <Element>el1</Element>
    <Element>el2</Element>
   </Elements>

  <Elements>
    <Element>el1</Element>
    <Element>el2</Element>
   </Elements>
</Root>

在根部
再渲染一些
在这里渲染一些东西
在这里渲染其他内容
如果我将模式添加到第一个模板,两者都不会渲染

还尝试:

<xsl:stylesheet version="1.0">
      <xsl:template match="/Root">
           At root level
             <xsl:apply-templates select="Elements">

             <h1>Render something more</h1>

             <xsl:apply-templates select="Elements" mode="1:Custom">
        </xsl:template>


    <!-- This doesn't render though it is called above-->
      <xsl:template match="Elements"> 
      render something here
      </xsl:template>

    <!-- This renders twice -->
      <xsl:template match="Elements" mode="1:Custom">
      render something else here
      </xsl:template>
</xsl:stylesheet>

使用不同的模板应用为:

 <xsl:apply-templates select="Elements" mode="1:Custom" />

仅渲染两种模式中的一种(具有指定模式的第一种模式)。 i、 e


不渲染

渲染两次

我该如何解决这个问题?无论我在哪里研究,它都建议优先考虑模式。一定很简单,因为有这么多程序员使用它?


<xsl:template match="Elements">
</xsl:template>
在根部 在第一个模板之后 第一个模板

第二模板

因此,此转换是正确的

    mode="Custom"
<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="/Root">
       At root level
     <xsl:apply-templates select="Elements"/>
     <h1>Render something more</h1>

     <xsl:apply-templates select="Elements" mode="Custom"/>
    </xsl:template>

    <xsl:template match="Elements">
       render something here

    </xsl:template>

    <xsl:template match="Elements" mode="Custom">

     render something else here
   </xsl:template>

   <xsl:template match="text()"/>
</xsl:stylesheet>

在根部
再渲染一些
在这里渲染一些东西
在这里渲染其他内容
应用于提供的XML文档时

    mode="Custom"
<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="/Root">
       At root level
     <xsl:apply-templates select="Elements"/>
     <h1>Render something more</h1>

     <xsl:apply-templates select="Elements" mode="Custom"/>
    </xsl:template>

    <xsl:template match="Elements">
       render something here

    </xsl:template>

    <xsl:template match="Elements" mode="Custom">

     render something else here
   </xsl:template>

   <xsl:template match="text()"/>
</xsl:stylesheet>

el1
el2
el1
el2
生成所需的正确结果:

<Root>
    <Elements>
        <Element>el1</Element>
        <Element>el2</Element>
    </Elements>
    <Elements>
        <Element>el1</Element>
        <Element>el2</Element>
    </Elements>
</Root>
在根级别
在这里渲染一些东西
在这里渲染一些东西
再渲染一些
在这里渲染其他内容
在这里渲染其他内容

如果不查看XSLT程序的其余部分,就无法回答此问题。你在某个地方犯了一个很简单的错误,但是上下文不足以指出它。尝试生成对您来说仍然失败的最小XSLT/XML对,并将其添加到您的问题中。您应该向我们展示更多有关XSLT的内容。希望它更清晰一点?您是否尝试过在任何模式下不使用前缀?意思是没有“1:”或里面有:的任何东西。好问题,+1。请参阅我的答案,以了解您遇到的问题的解释以及完整、简短和简单的解决方案:)
<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="/Root">
       At root level
     <xsl:apply-templates select="Elements"/>
     <h1>Render something more</h1>

     <xsl:apply-templates select="Elements" mode="Custom"/>
    </xsl:template>

    <xsl:template match="Elements">
       render something here

    </xsl:template>

    <xsl:template match="Elements" mode="Custom">

     render something else here
   </xsl:template>

   <xsl:template match="text()"/>
</xsl:stylesheet>
<Root>
    <Elements>
        <Element>el1</Element>
        <Element>el2</Element>
    </Elements>
    <Elements>
        <Element>el1</Element>
        <Element>el2</Element>
    </Elements>
</Root>
       At root level

   render something here


   render something here

<h1>Render something more</h1>

 render something else here


 render something else here