在同一级别为同一XML元素呈现不同的模板
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
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