【问题标题】:Using xsl:key to store result of boolean expression使用 xsl:key 存储布尔表达式的结果
【发布时间】:2012-12-20 10:39:49
【问题描述】:

在我的转换中有一个表达式,一些元素被反复测试。为了减少冗余,我想将其封装在 xsl:key 中,如下所示(不起作用):

<xsl:key name="td-is-empty" match="td" use="not(./node()[normalize-space(.) or ./node()])" />

如果表达式被成功评估,则预期行为是产生布尔值true 的关键,否则是false。那么我想如下使用它:

<xsl:template match="td[not(key('td-is-empty', .))]" />

这可能吗?如果可以,怎么做?

【问题讨论】:

    标签: xpath xslt-1.0 xslkey


    【解决方案1】:

    我认为在 XSLT 1.0 中,键值始终是字符串类型,因此在您的示例中,键值可以是字符串 true 或字符串 false。然后,您可以调用key('td-is-empty', 'true') 查找表达式为真的所有td 元素节点,调用key('td-is-empty', 'false') 查找表达式为假的所有td 元素。

    但是,您似乎想用您的密钥做一些不同的事情,例如根据节点身份为每个 td 节点存储 use 表达式的结果。我不认为这就是 XSLT 中键的工作方式。

    [编辑] 但是,您可以将您的要求表达为

    <xsl:template match="td[count(. | key('td-is-empty', 'false')) = count(key('td-is-empty', 'false'))]">...</xsl:template>
    

    匹配那些td 元素,它们是key('td-is-empty', 'false') 找到的元素集的成员。

    【讨论】:

    • 谢谢!好像我对键的工作方式有一些误解。我会尝试你的建议,但除非条件变得更复杂,否则它可能不会简化我的代码帮助
    猜你喜欢
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多