测试所有后代节点中特定属性的值

Test for value of specific attribute in all descendant nodes

我这里有这个XML:

<otherNodes>
    <table activateBitmask="true" bitmaskName="Foobar">
        <rowh><col>Foo</col></rowh>
        <row>
            <col>Bar</col>
        </row>
    </table>
</otherNodes>

我只想添加一个 javascript,如果 table 表示“位掩码”(activateBitmask="true")。但它并不总是 <table> 节点。所以我想在所有节点中搜索属性 activateBitmask 并查看它是否是 true.

<!-- This runs on <otherNodes> -->
<xsl:if test="descendant::*[@activateBitmask] = true()">
    <script type="text/javascript">
        <xsl:attribute name="src">
            <xsl:value-of select="$relpath"/><xsl:text>bitmask.js</xsl:text>
        </xsl:attribute>
    </script>
</xsl:if>

在另一个位置 @activateBitmask = true() 工作正常所以我认为 descendant::*[] 是错误的。

感谢您的帮助。

使用 test="descendant::*[@activateBitmask] = true()" 时,您将 node-set 与布尔值进行比较,其效果取决于您 运行 是否处于 1.0 兼容模式(这将是如果您正在使用 XSLT 1.0 处理器或您的样式表指定 version="1.0").

在 1.0 模式下,比较一个 node-set 和布尔值 true returns 如果 node-set 是 non-empty 则为真,也就是说,如果有一个后代元素@activateBitmask 属性。

在 2.0 模式下,将 node-set 与布尔值 true returns 进行比较,如果 node-set 中的某个节点的类型值为 true - 永远不会是这种情况除非你是 运行 schema-aware XSLT。

其实更简单:直接写

test="descendant::*[@activateBitmask]"

或者如果您愿意

test=".//@activateBitmask"

在 1.0 和 2.0 模式下,如果 node-set 为 non-empty,则 returns 为真。

I want to search in all nodes for an attribute activateBitmask and see if it's true.

我相信你的意思是:

"在所有节点中搜索属性 activateBitmask 并查看其 string-value 是否为 "true"".

可以写成:

<xsl:if test="descendant::*[@activateBitmask='true']">

或很快:

<xsl:if test="//@activateBitmask[.='true']">

你写了什么:

<xsl:if test="descendant::*[@activateBitmask] = true()">

测试元素的“真实性”,即activateBitmask属性的,并将被评估正如凯博士在上面的回答中所解释的那样。

我只会补充一点,xsl:iftest 属性中的表达式始终计算为布尔结果,因此即使在 XSLT 1.0 中,将表达式表述为 some-node = true() 也是多余的:如果节点存在,则该节点为真。但是,节点为真并不等同于 string-value 为“真”。