Css 类型开关大小写属性()?

Css 类型开关大小写属性()?,css,xml,xquery,exist-db,Css,Xml,Xquery,Exist Db,我试图为所有具有特定属性的元素执行一个typeswitch,例如@test,最初不管属性是如何定义的。这是迄今为止我在xql文件中看到的内容: 声明函数tei2:tei2html($nodes as node()*){ 对于$node中的$node 返回 类型开关($node) 案例属性(测试)返回 {tei2:tei2html($node/node())} };如果$node是一个属性,那么它没有任何子项,所以$node/node()将不选择任何内容。如果$node是一个属性,那么它没有任何

我试图为所有具有特定属性的元素执行一个typeswitch,例如
@test
,最初不管属性是如何定义的。这是迄今为止我在xql文件中看到的内容:

声明函数tei2:tei2html($nodes as node()*){
对于$node中的$node
返回
类型开关($node)
案例属性(测试)返回
{tei2:tei2html($node/node())}

};
如果$node是一个属性,那么它没有任何子项,所以
$node/node()
将不选择任何内容。

如果$node是一个属性,那么它没有任何子项,所以
$node/node()
将不选择任何内容。

让我们看看通过

元素添加到
tei2:tei2html()
函数:

  • 函数将
    元素作为
    $nodes
    参数接收
  • FLWOR遍历
    $node
    ,为每个节点分配
    $node
    。在第一次迭代中,
    $node
    是您的
    元素
  • typeswitch表达式查看
    $node
    以查看它是否是一个属性<代码>不是一个属性,因此它将进入下一个测试,或者如果没有进一步的测试,它将返回默认值(您在这里没有给出-事实上,由于缺少
    默认值
    表达式,显示的代码将显示错误)
  • 如果您的
    默认值
    return()
    ,则表达式将在此处结束,结果为0
  • 如果您的
    默认值为
    返回tei:tei2html($node/node())
    ,则会在

    的子节点上再次调用该函数,即
    @test
    属性。这一次,属性测试可以工作,但它将返回一个空的
    元素,因为正如Michael所说,如果
    $node
    是一个属性,那么
    $node/node()
    将不选择任何内容,因为属性没有子级
  • 更典型的是,在递归类型切换转换中,我们在处理元素的过程中处理属性——正如Adam所建议的那样

    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())
    };
    
    声明函数tei2:tei2html($nodes as node()*){
    对于$node中的$node
    返回
    类型开关($node)
    case元素(p)返回
    
    {
    如果($node/@test),则
    属性类{$node/@test}
    其他的
    ()
    ,
    tei2:tei2html($node/node())
    }
    

    默认返回tei2:tei2html($node/node()) };
    这会将

    转换为


    attribute()
    测试没有什么不合法的地方,但实际上它们的处理与其父元素密切相关,因此大多数递归类型切换转换都是在处理父元素的过程中处理属性的。

    让我们来研究一下通过

    元素添加到
    tei2:tei2html()
    函数:

  • 函数将
    元素作为
    $nodes
    参数接收
  • FLWOR遍历
    $node
    ,为每个节点分配
    $node
    。在第一次迭代中,
    $node
    是您的
    元素
  • typeswitch表达式查看
    $node
    以查看它是否是一个属性<代码>
    不是一个属性,因此它将进入下一个测试,或者如果没有进一步的测试,它将返回默认值(您在这里没有给出-事实上,由于缺少
    默认值
    表达式,显示的代码将显示错误)
  • 如果您的
    默认值
    return()
    ,则表达式将在此处结束,结果为0
  • 如果您的
    默认值为
    返回tei:tei2html($node/node())
    ,则会在

    的子节点上再次调用该函数,即
    @test
    属性。这一次,属性测试可以工作,但它将返回一个空的
    元素,因为正如Michael所说,如果
    $node
    是一个属性,那么
    $node/node()
    将不选择任何内容,因为属性没有子级
  • 更典型的是,在递归类型切换转换中,我们在处理元素的过程中处理属性——正如Adam所建议的那样

    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())
    };
    
    声明函数tei2:tei2html($nodes as node()*){
    对于$node中的$node
    返回
    类型开关($node)
    case元素(p)返回
    
    {
    如果($node/@test),则
    属性类{$node/@test}
    其他的
    ()
    ,
    tei2:tei2html($node/node())
    }
    

    默认返回tei2:tei2html($node/node()) };
    这会将

    转换为


    attribute()
    测试没有什么不合法的地方,但实际上它们的处理与它们的父元素密切相关,因此,大多数递归类型切换转换都是在处理父元素的过程中处理属性。

    在这种情况下,您很可能希望打开元素并检查其属性。在这种情况下,您很可能希望打开元素并检查其属性。Joe,这是非常有帮助的——谢谢你花时间解释得如此透彻!我会努力解决这个问题,看看它会把我带到哪里。非常感谢。乔,这真是帮了大忙——谢谢你花时间解释得这么透彻!我会努力解决这个问题,看看它会把我带到哪里。谢谢你