我正在尝试为具有特定属性的所有元素执行typeswitch,例如@test
,最初不管属性是如何定义的。这是我到目前为止在xql文件中的内容:
declare function tei2:tei2html($nodes as node()*) {
for $node in $nodes
return
typeswitch ($node)
case attribute(test) return
<b>{ tei2:tei2html($node/node()) }</b>
};
&#13;
我在xml文件<p test="test">
中创建了一个测试属性,但没有任何反应 - 我希望<p>
变为粗体。我错过了什么?这是可能的,还是创建一个将属性转换为css类的函数会更好?
更新的问题
我已将此类型切换添加到tei2html.xql中,它有点像我想要的那样,但并不完全。
这是新代码:
case element(tei:div) return
<p>
{
if ($node/@type="subhead") then
attribute class {$node/@type="subhead"}
else
()
,
tei2:tei2html($node/node())
}
</p>
结果是:
<p class="true">SECT. II.</p>
所以,而不是添加属性&#34; subhead,&#34;它添加属性&#34; true。&#34;这里发生了什么?
更新更新的问题
我是一只愚蠢的小鸟。我通过将typeswitch行更改为:来修复它attribute class {$node/@type="subhead"}
完成!
答案 0 :(得分:0)
如果$ node是一个属性,那么它没有任何子节点,因此$node/node()
将不会选择任何子节点。
答案 1 :(得分:0)
让我们了解将<p test="test">
元素传递给tei2:tei2html()
函数时会发生什么:
<p>
元素作为$nodes
参数。$nodes
,为每个$node
分配$node
。在第一次迭代中<p>
是您的$node
元素<p>
以查看它是否属于某个属性。 default
不是一个属性,因此它会进入下一个测试,或者如果没有进一步的测试,它会返回默认值(这里没有给出 - 实际上所呈现的代码会出现错误,因为缺少default
表达式)。 return ()
为default
,则表达式将在此处结束,结果为0。 return tei:tei2html($node/node())
为<p test="test">
,则会在@test
的子节点上再次调用该函数,即<b>
属性。这一次,属性测试会起作用,但它会返回一个空的$node
元素,因为正如迈克尔所说,如果$node/node()
是一个属性,那么declare function tei2:tei2html($nodes as node()*) {
for $node in $nodes
return
typeswitch ($node)
case element(p) return
<p>
{
if ($node/@test) then
attribute class {$node/@test}
else
()
,
tei2:tei2html($node/node())
}
</p>
default return tei2:tei2html($node/node())
};
将不会选择任何内容,因为属性不会生孩子。更典型的是,在递归类型切换转换中,我们在处理元素的过程中处理属性 - 正如亚当所建议的那样。
<p test="test">
这会将<p class="test">
转换为attribute()
。
bubbleSort(array);
测试没有任何违法行为,但实际上他们的处理与其父元素紧密相关,因此大多数情况下递归类型切换转换在处理其父元素的过程中处理属性。 / p>