使用谓词作为模板参数传递位置路径

时间:2012-09-29 16:44:14

标签: xml xslt xpath

<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>

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

非常感谢提前

2 个答案:

答案 0 :(得分: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 -->
...

article可能会有所帮助。

答案 1 :(得分:0)

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

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