我不是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"
),导入的模板我试图切换到没有模式。
我很感激任何建议!
答案 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>
允许您避免模式问题。