是否有可能在XSLT样式表使用动态XPath表达式?是否有可能在XSLT样式表使用动态XPath表达

2019-05-12 07:29发布

我想使用XSLT参数的值的XPath表达式。 具体而言,作为一个的一部分not()中的呼叫<xsl:if表达。

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- my_param contains a string '/foo/bar', passed in from ant -->
    <!-- the 'no' is just a default value -->
    <xsl:param name="my_param">no</xsl:param>
    <xsl:variable name="var_myparam" select="$my_param" />
    <!-- ... -->

    <!-- this works -->
    <xsl:if test="not(/foo/bar)" /> <!-- expression returns boolean true -->
        <!-- ... -->
    </xsl:if>

    <!-- I can't figure out how to do this the right way -->
    <!-- None of these appear to work -->
    <xsl:if test="not($var_myparam)" /> <!-- expression returns boolean false -->
        <!-- ... -->
    </xsl:if>       
    <xsl:if test="not({$var_myparam})" /> <!-- complains Required attribute 'test' is missing -->
        <!-- ... -->
    </xsl:if>       
    <xsl:if test="not({$myparam})" />   <!-- complains Required attribute 'test' is missing -->
        <!-- ... -->
    </xsl:if>       
    <xsl:if test="not($myparam)" />     <!-- expression returns boolean false -->
        <!-- ... -->
    </xsl:if>       

</xsl:transform>

我在正确的语法是什么在XSLT样式表创建一个动态的XPath表达式有点不清楚。 我也是一个paramater,变量之间的差别有点模糊了,怎么这两部作品的expanstion。 例如,参数,我知道有时候我需要的支架,有时候我不知道。

<!-- when creating an element, it seems I need brackets -->
<xsl:element name="{$my_param}" />

<!-- when selecting an element value for the output stream, no brackets are needed -->
<xsl:value-of select="$my_param"/>

任何普通/具体的帮助将不胜感激。

Answer 1:

退房http://www.exslt.org/ 。 具体看动态:评估模块。



Answer 2:

XSLT不支持的XPath的动态评估-这就是为什么你需要使用扩展功能就像EXSLT的evaluate做到这一点。

如果你不希望使用扩展功能(也有很好的理由不),另一种可能性是查询输入文档的DOM在执行前的变换,并通过该节点设置到transform作为参数。

编辑

关于那些花括号:这些是属性值模板(AVTS)。 这些都是在XSLT转换语义上等效:

<foo>
   <xsl:attribute name="bar">
      <xsl:value-of select="XPathExpression"/>
   </xsl:attribute>
</foo>

<foo bar="{XPathExpression}"/>

第二个是只是第一个快捷方式。

关于变量和参数:语法上,有一个变量和参数之间没有区别; 任何你引用$foo XPath表达式中,将工作是否相同foo被定义xsl:variablexsl:param

两者之间的区别是它们是如何被填充。 变量会在xsl:variable声明。 参数使用命名模板声明xsl:param ,但他们以任何调用命名模板,使用填充xsl:with-param ,如:

<xsl:call-template name="foo">
   <xsl:with-param name="bar" select="XPathExpression"/>
</xsl:call-template>

<xsl:template name="foo">
   <xsl:param name="bar"/>
   ...

大鸣喇叭例外,这是一个孩子参数xsl:stylesheet 。 有没有办法来填充内改变这些参数; 那些在外部填充,由任何(特定于环境的)机构被调用变换。

一个很常见的用例是弥补的事实,XSLT没有一个系统日期功能。 所以,你会看到类似这样的:

<xsl:stylesheet ...
   <xsl:param name="system-date"/>
   ...

然后,调用时变换,像这样(在C#):

XsltArgumentList args = new XsltArgumentList();
args.AddParam("system-date", "", DateTime.Now.ToString("s"));
xslt.Transform(input, args, result);


Answer 3:

试试这一些变化:

<xsl:if test="not($var_myparam = 'no'))">
</xsl:if>

问题是XPath中如何评估布尔值。 任何非空字符串将评估为true的XPath。 结帐这个写了关于XPath的布尔值 。

至于你的其他问题...变量和参数的作用一样XPath表达式对方。 两者都与形式是$ var引用。

任何名为XSLT属性“中选择,”你不需要括号。 该支架在所谓的使用“属性值的模板。” 您可以使用它们的时候XSLT期待一个字符串,例如:

<xsl:template match="name-a">
  <xsl:variable name="old-name" select="name(.)" />
  <name-b old-name="{$old-name}" new-attribute="hello"  />
</xsl:template>

在约AVTS XSLT规范会谈 ,所以做这个页面 。



文章来源: Is it possible to use a Dynamic xPath expression in a xslt style sheet?
标签: xml xslt ant xpath