渲染转换其他元素(XSLT,XQL和eXist-db)中的XML元素

时间:2016-08-16 20:47:15

标签: xml xslt xquery exist-db

我正在尝试在xml中呈现标题页,我正在通过eXist-db应用程序进行。这是相关的xml:



<front>
            <titlePage>
                <titlePart>
                    <lb>THE</lb>
                    <lb>ADVENTURES</lb>
                    <lb>OF</lb>
                    <lb>Roderick Random.</lb>
                    <lb><epigraph xml:lang="la">
                        <cit>
                            <quote xml:lang="la" link="http://www.perseus.tufts.edu/hopper/text?doc=Perseus%3Atext%3A1999.02.0062" title="Satires 2.5.8: 'But birth and virtue, unless [attended] with substance, is viler than seaweed.'">
                                <l>Et genus &amp; virtus, nisi cum re, vilior alga est.</l>
                            </quote>
                            <bibl>
                                <author ref="HOR" link="http://en.wikipedia.org/wiki/Horace" title="Quintus Horatius Flaccus, Roman lyric poet of the 1st century BCE">HOR.</author>
                            </bibl>
                        </cit>
                    </epigraph>
                    </lb>
                    <lb>IN TWO VOLUMES.</lb>
                    <lb>VOL. I.</lb>
                    <lb>THE TENTH EDITION.</lb>
                    <hr/>
                    <lb><name type="place">LONDON:</name></lb>
                    <lb>Printed for W. STRACHAN, J. RIVINGTON, R. BALDWIN, HAWES CLARKE, AND COLLINS, W. JOHNSTON, T. CASLON, B. LAW, J. JOHNSON AND Co, W. AND J. RICHARDSON, T. BECKETT, and P.. DeHONDT,</lb>
                    <lb><date title="1775">MDCCLXXV.</date></lb>
                </titlePart>
            </titlePage>
            <pb n="titlepage" facs="smollett.png"/>
        </front>
&#13;
&#13;
&#13;

此时以图形方式,我想要的是在单独的一行上的每个<lb>。我还希望<epigraph>出现在标题页的现有逻辑中的任何位置 - 也就是说,与现有<lb>内联。此屏幕截图应有助于明确说明:screenshot of flawed rendered page

以下是带有xsl转换的相关.xql位。如果你想看到所有的.xql,你可以在这里看到(再次,为整个真正的不优雅道歉):https://gist.github.com/tonyahowe/c55167e13ae22139f94080289cb88f47

&#13;
&#13;
declare function tei2:tei2html($nodes as node()*) {
    for $node in $nodes
    return
        typeswitch ($node)
            case text() return
                $node
            case element(tei:TEI) return
                tei2:tei2html($node/*)
            case element(tei:teiHeader) return
                tei2:header($node) 
            case element(tei:frontTitle) return
                <h3>{ tei2:tei2html($node/node()) }</h3>
            case element(tei:lb) return
                <br>{ tei2:tei2html($node/node()) }</br>
            case element(tei:l) return
                <l>{ tei2:tei2html($node/node()) }</l>
            case element(tei:i) return
                <i>{ tei2:tei2html($node/node()) }</i>
            case element(tei:pb) return
                <span style="color:lightgray">[end page {tei2:tei2html($node/@n)}]{ tei2:tei2html($node/node()) }</span>
            case element(tei:footer) return
                <hr>{ tei2:tei2html($node/node()) }</hr>
            case element(tei:front) return
                tei2:front($node)
            case element(tei:rs) return 
                tei2:link($node)
            case element(tei:quote) return 
                tei2:link($node)
            case element(tei:note) return
               tei2:note($node) 
            case element(tei:footnote) return
                tei2:footnote($node)
            case element(tei:p) return
                <p xmlns="http://www.w3.org/1999/xhtml" id="{tei2:get-id($node)}">{ tei2:tei2html($node/node()) }</p> (: THIS IS WHERE THE ANCHORS ARE INSERTED! :)
            case element(exist:match) return
                <mark xmlns="http://www.w3.org/1999/xhtml">{ $node/node() }</mark>
            case element() return
                tei2:tei2html($node/node())
            default return
                $node/string() (: what would this catch? comment node in the xml? :)
};

declare function tei2:link($node as element()) {
  if ($node/@link ne '' and $node/@link castable as xs:anyURI) then 
    <a href="{$node/@link}" data-toggle="tooltip" title="{$node/@title}">{
      tei2:tei2html( $node/node() )
    }</a>
  else 
    tei2:tei2html( $node/node() )
};

declare function tei2:note($node as element()) {
    <span style="color:black" href="{$node/@link}" data-toggle="tooltip" title="{$node/@title}"> {
        tei2:tei2html ( $node/node() )
    }</span>
}; 

-------------------------- cut

declare function tei2:front($front as element (tei:front)) {
    let $titlePage := $front//tei:titlePage
    let $titlePart := $front//tei:titlePart
    let $epigraph := $front//tei:epigraph
    let $note := $front//tei:note
    let $argument := $front//tei:argument
    let $quote := $front//tei:quote
    let $bibl := $front//tei:bibl
    let $author := $front//tei:author
    
    return
        <div xmlns="http://www.w3.org/1999/xhtml" class="main-text-frontmatter">
        {   
            for $lb in $titlePage
            return 
                $titlePage//tei:lb
                
                    
            }
  
            {
                console:log($epigraph),
                for $cit in $epigraph
                return
                    <blockquote>
                        {
                            <a href="{$quote/@link}" data-toggle="tooltip" title="{$quote/@title}">{$quote/tei:l}</a>
                            
                        }<br/>

                        --
                            {
                                <a href="{$author/@link}" data-toggle="tooltip" title="{$author/@title}">{$author/text()}</a>
                            }
                    </blockquote>
            }
            </div>
};
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:2)

通常在TEI中,lb元素是一个空的里程碑元素,因此它只显示为:<lb/>。 (参见关于lb元素的TEI指南。它标记了换行的位置,而不是围绕一行的整个内容,就像你在TEI中使用它一样。

以同样的方式,HTML的<br/>元素是一个空元素。因此,此元素的类型切换可以变为case element(tei:lb) return <br/>

将您的TEI标记调整为此<lb/>表单,并将您的typeswitch调整为输出HTML <br/>元素,可以帮助您找到解决方案的路径。

答案 1 :(得分:1)

我不知道您将dataHit <- data[data[["Hit"]] == 1, ] dataHit[["Type"]] <- factor(data[["Type"]]) dataHit[["Quarter"]] <- factor(data[["Quarter"]]) table(dataHit[["Type"]], dataHit[["Quarter"]]) 元素转换为HTML的位置:

lb

这只会转出TEI XML,这将是无效的HTML。

看起来for $lb in $titlePage return $titlePage//tei:lb 函数会在HTML中正确呈现tei2:tei2html,但它也会呈现您要排除的<lb>。如果您的XML非常可预测且与您的示例类似,则可以使用谓词排除包含<epigraph>的{​​{1}}:

<lb>

但这相当脆弱,并且还会排除epigraph个包含$titlePage//tei:lb[not(tei:epigraph)] 的{​​{1}}与您可能要保留的任何文本节点混合的内容。在这种情况下,您可以递归处理元素以删除它们:

<lb>

<强>更新

如果你 DO 想要内联呈现<epigraph>元素,那么只需使用declare function local:remove-epigraph( $node as node() ) as node()* { typeswitch ($node) case element(tei:epigraph) return () case element() return element { node-name($node) } { for $n in $node/node() return local:remove-epigraph($node) } default return $node }; ... $titlePage//tei:lb/local:remove-epigraph(.) 函数来呈现它们:

epigraph