在切换到导入的模板

时间:2016-04-26 18:48:11

标签: xml xslt

我不是XSL大师,而是我去的一个积极的业余学习。我正在处理一个XSL样式表,该样式表导入了一个我不拥有并希望独自留下的大型模板库。

我试图找出一种拦截特定元素的方法,并在将其移交给导入的模板之前进行一些小改动。具体来说,我想修改<image>元素的属性值,但是否则允许处理像往常一样继续。看起来这应该是可行的,但我很难过。

这是我目前所拥有的,但不起作用:

<!-- intercept image elements before imported template sees them -->
<xsl:template match="image" name="image_intercept">
  <!-- preprocess image element and capture it in a variable -->
  <xsl:variable name="preprocessed_image">
    <xsl:apply-templates select="." mode="preprocess-image" />
  </xsl:variable>
  <!-- Now send the modified version on to the imported template....
       except of course this doesn't work -->
  <xsl:apply-templates select="$preprocessed_image" />
</xsl:template>

<xsl:template match="*" mode="preprocess_image">
  <!-- For this example I'll just copy it through unchanged.
       In reality I'll change an attribute value. -->
  <xsl:copy-of select="." />
</xsl:template>

这会失败,正如我预期的那样,因为image_intercept模板最终会循环播放。我不想再次在同一个模板上匹配;相反,我想将$preprocessed_image移交给匹配<image>元素的导入模板。但我无法找到一种方法。我试过这个:

...
<!-- apply templates with mode to avoid looping -->
<xsl:apply-templates select="$preprocessed_image" mode="passthrough"/>
...

<!-- hand off processing to imported template -->
<xsl:template match="*" mode="passthrough">
  <xsl:apply-imports/>
</xsl:template>

但这不起作用,因为<xsl:apply-imports>继承了模板模式("passthrough"),导入的模板我试图切换到没有模式。

我很感激任何建议!

1 个答案:

答案 0 :(得分:0)

如果属性服务器用于区分元素,则可能在匹配模式中使用它,如

<!-- intercept image elements before imported template sees them -->
<xsl:template match="image[not(@att-name)]" name="image_intercept">
  <!-- preprocess image element and capture it in a variable -->
  <xsl:variable name="preprocessed_image" as="element()">
    <xsl:apply-templates select="." mode="preprocess-image" />
  </xsl:variable>
  <!-- Now send the modified version on to the imported template....
       except of course this doesn't work -->
  <xsl:apply-templates select="$preprocessed_image" />
</xsl:template>

<xsl:template match="*" mode="preprocess_image">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:attribute name="att-name" select="'foo'"/>
    <xsl:copy-of select="node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="image[@att-name]">
  <xsl:apply-imports/>
</xsl:template>

允许您避免模式问题。