0

所以我使用 XSLT 的标识设计模式:

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()[not(@visible='false')]"/>
  </xsl:copy>
</xsl:template>

而且我确实有很多模板匹配不同的节点。现在我想做的是在一个 xsl:template 中生成一些代码,并让另一个 xsl:template 匹配新生成的代码。有谁知道如何做到这一点?


我想做的例子:

<xsl:template match="button">
     <a href="@url" class="button"> <xsl:value-of select="@name" /> </a>
</xsl:template>

<xsl:template match="stuff">
    <!-- do some stuff -->
    <!-- get this following line parsed by the template over! -->
    <button url="something" name="a button" />
</xsl:template>
4

2 回答 2

3

您不能以您尝试的方式完全按照您想要的方式做,但是如果打算重用代码并避免重复模板,则将匹配的模板称为命名模板是完全可以接受的,参数也。

<xsl:template match="button" name="button"> 
   <xsl:param name="url" select="@url" />
   <xsl:param name="name" select="@name" />
   <a href="{$url}" class="button"> <xsl:value-of select="$name" /> </a> 
</xsl:template> 

所以,这里如果匹配一个按钮元素,它会使用urlname属性作为默认值,但是如果你调用它作为named-template,你可以传入你自己的参数

<xsl:template match="stuff"> 
   <!-- do some stuff --> 
   <!-- get this following line parsed by the template over! --> 
   <xsl:call-template name="button">
    <xsl:with-param name="url" select="'something'" /> 
    <xsl:with-param name="name" select="'A button'" /> 
   </xsl:call-template> 
</xsl:template> 
于 2012-05-08T19:42:24.207 回答
1

您应该能够使用node-set()扩展功能进行一些多遍处理。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/*">
    <xsl:variable name="first_pass">
      <xsl:apply-templates select="button" />
    </xsl:variable>

    <xsl:apply-templates mode="second_pass" select="ext:node-set($first_pass)/*" />
  </xsl:template>

  <xsl:template match="button">
    <a href="@url" class="button"> <xsl:value-of select="@name" /> </a>
  </xsl:template>

  <xsl:template match="stuff" mode="second_pass">
    <!-- do some stuff -->
    <!-- get this following line parsed by the template over! -->
    <button url="something" name="a button" />
  </xsl:template>
</xsl:stylesheet>

您可以在 XSLT 的第一个答案中获得更多详细信息- apply a template to call-template result

于 2012-05-09T02:06:19.563 回答