测试所有后代节点中特定属性的值
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:if
的 test
属性中的表达式始终计算为布尔结果,因此即使在 XSLT 1.0 中,将表达式表述为 some-node = true()
也是多余的:如果节点存在,则该节点为真。但是,节点为真并不等同于 string-value 为“真”。
我这里有这个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'strue
.
我相信你的意思是:
"在所有节点中搜索属性 activateBitmask
并查看其 string-value 是否为 "true"
".
可以写成:
<xsl:if test="descendant::*[@activateBitmask='true']">
或很快:
<xsl:if test="//@activateBitmask[.='true']">
你写了什么:
<xsl:if test="descendant::*[@activateBitmask] = true()">
测试元素的“真实性”,即activateBitmask
属性的父,并将被评估正如凯博士在上面的回答中所解释的那样。
我只会补充一点,xsl:if
的 test
属性中的表达式始终计算为布尔结果,因此即使在 XSLT 1.0 中,将表达式表述为 some-node = true()
也是多余的:如果节点存在,则该节点为真。但是,节点为真并不等同于 string-value 为“真”。