1
<xsl:template match="foobar">
    <xsl:if test="a[name = 'foo']">
        <xsl:apply-templates select="x/y[1]|x/y[2]" />
    </xsl:if>
    <xsl:if test="a[name = 'bar']">
        <xsl:apply-templates select="x/y[3]|x/y[4]|x/y[5]" />
    </xsl:if>
</xsl:template>

我想将位置路径表达式 "x/y[1]|x/y[2]" 和 x/y[3]|x/y[4]|x/y[5] 作为参数传递,因为这个值将来可能会改变,我不想编辑模板,只想编辑参数定义。我想使用上面的模板作为

<xsl:template match="foobar">
    <xsl:if test="a[name = 'foo']">
        <xsl:apply-templates select="$param1" />
    </xsl:if>
    <xsl:if test="a[name = 'bar']">
        <xsl:apply-templates select="$param2" />
    </xsl:if>
</xsl:template>

据我所知,这是不可能的。将位置路径表达式外部化的最佳方法是什么?

提前谢谢了

4

2 回答 2

1
<xsl:template match="foobar">
    <xsl:param name="param1" />
    <xsl:param name="param2" />
    <xsl:if test="a[name = 'foo']">
        <xsl:apply-templates select="$param1" />
    </xsl:if>
    <xsl:if test="a[name = 'bar']">
        <xsl:apply-templates select="$param2" />
    </xsl:if>
</xsl:template>

然后你调用模板:

<xsl:call-template name="foobar">
    <xsl:with-param name="param1" select="actualXPath1"/>
    <xsl:with-param name="param2" select="actualXPath2"/>
</xsl:call-template>

或者您可以在 XSLT 文件的开头使用全局参数。

<xsl:param name="param1" select="actualXPath1"/>
<xsl:param name="param2" select="actualXPath2"/>
<!-- continue with template definitions -->
...

这篇文章可能会有所帮助。

于 2012-09-29T18:38:24.730 回答
0

如果您不介意使用专有函数或 EXSLT,您可以动态评估可用作字符串的 XPath 表达式:

  • EXSLT 的dyn:evaluate(string)
  • Saxon 6.5.5 和 9.x 也有一个专有的 evaluate(string) 函数。

然后,您可以将这些 XPath 字符串作为全局参数传递给您的 XSLT,或者将它们存储在外部文件中。

于 2012-10-01T08:18:38.080 回答