我目前正在使用XML和XSLT进行开发。这是一个更大的项目的一部分,也是我的历史学博士学位的一部分,因此非常欢迎任何帮助!
我正在制作教科书的数字版,而这本书自然几乎总是彼此相邻,我希望彼此相邻显示。(我将为此使用bootstrap或SemanticUI)
所以我想“抓住”该<pb/>
元素之后的所有内容,直到到达下一个<pb/>
元素
因此,我构建了一个<xsl:template/>
将每个tei元素<pb/>
转换为具有特定类的div的。我的问题是<div>
应该范围到下一个<pb>
元素。
<xsl:template match="tei:pb">
<xsl:element name="div">
<xsl:attribute name="class">
<xsl:text>test;</xsl:text>
</xsl:attribute>
<xsl:attribute name="style">
<xsl:text>text-align:right;</xsl:text>
</xsl:attribute>
<xsl:text>[F.</xsl:text>
<xsl:value-of select="@n"/>
<xsl:text>]</xsl:text>
<xsl:element name="hr"/>
</xsl:element>
所需的布局将类似于以下html(无边框等)。
<div class="content">
<div class="panel-body">
<div class="test" style="width: 49%;border:solid 1px red; float:left">
<div class="page number" style="text-align:right;"> F.29v. <hr>
</div>
<div class="text" style="">
Example text
</div>
</div>
<div class="test" style="width:49%;border:solid 1px green;float:left;">
<div class="page number"style="text-align:right"> F.30r <hr> </div>
<div class="text" style="">
Here I want the text to be displayed</div>
</div>
我真的不希望我的代码能做我想做的事。我认为该代码确实按照这种方式编写时应该执行的操作,但是我希望它产生示例输出,我必须更改什么?(<pb>
每个XML文件中总是2个元素,而不是1个或3个,总是两个。
所以在伪代码中:
<xsl:template match="tei:pb and all the following elements til the next tei:pb> ```
and then transform it according to my rules
my full stylesheet:
https://pastebin.com/99CS6n6c
我的建议可以归结为
<xsl:template match="body">
<div class="panel-body">
<xsl:for-each-group select="*" group-starting-with="pb">
<div class="test" style="width: 49%;border:solid 1px red; float:left">
<xsl:apply-templates select="current-group()"/>
</div>
</xsl:for-each-group>
</div>
</xsl:template>
<xsl:template match="pb">
<div class="page number" style="text-align:right;">
<xsl:text>[F.</xsl:text>
<xsl:value-of select="@n"/>
<xsl:text>]</xsl:text>
<hr/>
</div>
</xsl:template>
<xsl:template match="p">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
“完整示例”:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xpath-default-namespace="http://www.tei-c.org/ns/1.0"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="html" indent="yes" html-version="5"/>
<xsl:template match="/">
<html>
<head>
<title>.NET XSLT Fiddle Example</title>
</head>
<body>
<xsl:apply-templates select="//body"/>
</body>
</html>
</xsl:template>
<xsl:template match="body">
<div class="panel-body">
<xsl:for-each-group select="*" group-starting-with="pb">
<div class="test" style="width: 49%;border:solid 1px red; float:left">
<xsl:apply-templates select="current-group()"/>
</div>
</xsl:for-each-group>
</div>
</xsl:template>
<xsl:template match="pb">
<div class="page number" style="text-align:right;">
<xsl:text>[F.</xsl:text>
<xsl:value-of select="@n"/>
<xsl:text>]</xsl:text>
<hr/>
</div>
</xsl:template>
<xsl:template match="p">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/ncntCSc
对于XSLT 2处理器,您需要拼写<xsl:mode on-no-match="shallow-copy"/>
为身份模板
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
使用该代码片段
<body>
<pb></pb>
<p> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. </p>
<pb></pb>
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. </p>
</body>
输入样本的转换为HTML片段
<div class="panel-body">
<div class="test" style="width: 49%;border:solid 1px red; float:left">
<div class="page number" style="text-align:right;">[F.]
<hr>
</div>
<p> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et
accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata
sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing
elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,
sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita
kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
</p>
</div>
<div class="test" style="width: 49%;border:solid 1px red; float:left">
<div class="page number" style="text-align:right;">[F.]
<hr>
</div>
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et
accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata
sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing
elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,
sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita
kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
</p>
</div>
</div>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句