我在通过xslt从xml文件生成html时遇到问题。 我使用tei生成的DTD和漫画书的cbml自定义。
这是我的xml结构:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE TEI SYSTEM "cbml.dtd">
<?xml-stylesheet type="text/xsl" href="sorgente.xsl"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0">
<teiHeader>
<fileDesc>
<titleStmt>
<title>Vi for Vendetta versione digitalizzata</title>
<respStmt>
<resp>codifica</resp>
<persName>Giulio Bambini</persName>
</respStmt>
<respStmt>
<resp>traduzione</resp>
<persName>Stefano Negrini</persName>
</respStmt>
<respStmt>
<resp>lettering</resp>
<persName>Maurizio Pieri</persName>
</respStmt>
</titleStmt>
<publicationStmt>
<publisher>Università di Pisa</publisher>
<pubPlace>Pisa, Italia</pubPlace>
<date>2015</date>
<availability>
<p>Licenza gratuita</p>
</availability>
</publicationStmt>
<sourceDesc>
<bibl>
<title>Vi for Vendetta</title>
<author>
<persName>Alan Oswald Moore</persName> e
<persName>David Lloyd</persName>
</author>
<publisher>DC Comics </publisher>
<pubPlace>Londra, Gran Bretagna</pubPlace>
<date>1982</date>
</bibl>
</sourceDesc>
</fileDesc>
<encodingDesc>
<projectDesc>
<p>
La seguente codifica con l'ausilio di Image Markup Tool ci permette di identificare il testo annotato sulle
immagini della Graphic Novel. All' interno del nostro elaborato i dialoghi sono stati evidenziati in corsivo e
sono stati inoltre raggruppati i nomi dei personaggi, delle organizzazioni e dei luoghi evidenziati nel testo.
</p>
</projectDesc>
</encodingDesc>
</teiHeader>
<facsimile>
<surface
xml:id="img-1"
ulx="0"
uly="0"
lrx="355"
lry="678">
<graphic url="tavole/1.jpg"/>
<zone
ulx="83"
uly="223"
lrx="272"
lry="256"
xml:id="line1"/>
<zone
ulx="92"
uly="251"
lrx="256"
lry="282"
xml:id="line2"/>
<zone
ulx="21"
uly="281"
lrx="330"
lry="308"
xml:id="line3"/>
<zone
ulx="36"
uly="306"
lrx="320"
lry="332"
xml:id="line4"/>
<zone
ulx="85"
uly="535"
lrx="249"
lry="556"
xml:id="line5"/>
<zone
ulx="97"
uly="556"
lrx="241"
lry="576"
xml:id="line6"/>
<zone
ulx="58"
uly="577"
lrx="281"
lry="595"
xml:id="line7"/>
<zone
ulx="68"
uly="595"
lrx="271"
lry="613"
xml:id="line8"/>
</surface>
</facsimile>
<facsimile>
<surface
xml:id="img-2"
ulx="0"
uly="0"
lrx="355"
lry="678">
<graphic url="tavole/2.jpg"/>
<zone
ulx="83"
uly="223"
lrx="272"
lry="256"
xml:id="line9"/>
<zone
ulx="92"
uly="251"
lrx="256"
lry="282"
xml:id="line10"/>
<zone
ulx="21"
uly="281"
lrx="330"
lry="308"
xml:id="line11"/>
<zone
ulx="36"
uly="306"
lrx="320"
lry="332"
xml:id="line12"/>
<zone
ulx="85"
uly="535"
lrx="249"
lry="556"
xml:id="line13"/>
<zone
ulx="97"
uly="556"
lrx="241"
lry="576"
xml:id="line14"/>
<zone
ulx="58"
uly="577"
lrx="281"
lry="595"
xml:id="line15"/>
<zone
ulx="68"
uly="595"
lrx="271"
lry="613"
xml:id="line16"/>
</surface>
</facsimile>
<text>
<body>
<div type="panelGrp" facs="img-1" xml:id="myElement-1">
<panel n="1" characters="#EmittenteRadioDelFato">
<balloon facs="line1" who="#EmittenteRadioDelFato" type="speech"><p>Buonasera Londra. Sono le nove, e questa è la<emph rendition="#b">voce del fato</emph> che trasmette sui 275 e 285
in onde medie... è il 5 novembre 1997.</p>
</balloon>
</panel>
<panel n="2" characters="#EmittenteRadioDelFato">
<balloon facs="#line2" type="speech" who="#EmittenteRadioDelFato"><p>Il tempo si manterrà bella fino alle 24:07, quando comincerà un <emph rendition="#b">acquazzone</emph> che durarà fino alle 01:30.</p>
</balloon>
</panel>
<panel n="3" characters="#EmittenteRadioDelFato">
<balloon facs="#line3" type="speech" who="#EmittenteRadioDelFato"><p>Per tutta la notte la temperatura resterà tra i 13 e i 14 gradi centigradi.</p>
</balloon>
</panel>
<panel n="4" characters="#EmittenteRadioDelFato">
<balloon facs="#line4" type="speech" who="#EmittenteRadioDelFato"><p>Si avverte la popolazione di Londra che da oggi le zone di Streatham e Brixton sono in <emph rendition="#b">quarantena</emph>.Si consiglia di evitare queste zone per motivi igienici e di sicurezza.</p>
</balloon>
</panel>
<panel n="5" characters="#EmittenteRadioDelFato">
<balloon facs="#line5" type="speech" who="#EmittenteRadioDelFato"><p>I dati di produttività dell'hereforshire lasciano sperare che nel febbraio del 1998 si possa porre fine al<emph rendition="#b">razionamento</emph> della carne.</p>
</balloon>
</panel>
<panel n="6" characters="#EmittenteRadioDelFato">
<balloon facs="#line6" type="speech" who="#EmittenteRadioDelFato"><p>Analoghe speranze anche per le <emph rendition="#b">uova</emph> e le <emph rendition="#b">patate</emph> grazie al'aumento della produzione.</p>
</balloon>
</panel>
<panel n="7" characters="#EmittenteRadioDelFato">
<balloon facs="#line7" type="speech" who="#EmittenteRadioDelFato"><p>Di primo mattino la polizia ha fatto irruzione in diciassette case della zona di Birmingham sgominando una pericolosa <emph rendition="#b">rete terroristica</emph>.</p>
</balloon>
<balloon facs="#line8" type="speech" who="#EmittenteRadioDelFato"><p>Venti persone, tra cui otto donne, sono attualmente detenute in attesa di giudizio.</p>
</balloon>
</panel>
<fw type="pageNum" place="lower-left">1</fw>
</div>
<div type="panelGrp" facs="img-2" xml:id="myElement-1">
<panel n="1" characters="#EmittenteRadioDelFato">
<balloon facs="line9" who="#EmittenteRadioDelFato" type="speech"><p>Buonasera Londra. Sono le nove, e questa è la<emph rendition="#b">voce del fato</emph> che trasmette sui 275 e 285
in onde medie... è il 5 novembre 1997.</p>
</balloon>
</panel>
<panel n="2" characters="#EmittenteRadioDelFato">
<balloon facs="#line10" type="speech" who="#EmittenteRadioDelFato"><p>Il tempo si manterrà bella fino alle 24:07, quando comincerà un <emph rendition="#b">acquazzone</emph> che durarà fino alle 01:30.</p>
</balloon>
</panel>
<panel n="3" characters="#EmittenteRadioDelFato">
<balloon facs="#line11" type="speech" who="#EmittenteRadioDelFato"><p>Per tutta la notte la temperatura resterà tra i 13 e i 14 gradi centigradi.</p>
</balloon>
</panel>
<panel n="4" characters="#EmittenteRadioDelFato">
<balloon facs="#line12" type="speech" who="#EmittenteRadioDelFato"><p>Si avverte la popolazione di Londra che da oggi le zone di Streatham e Brixton sono in <emph rendition="#b">quarantena</emph>.Si consiglia di evitare queste zone per motivi igienici e di sicurezza.</p>
</balloon>
</panel>
<panel n="5" characters="#EmittenteRadioDelFato">
<balloon facs="#line13" type="speech" who="#EmittenteRadioDelFato"><p>I dati di produttività dell'hereforshire lasciano sperare che nel febbraio del 1998 si possa porre fine al<emph rendition="#b">razionamento</emph> della carne.</p>
</balloon>
</panel>
<panel n="6" characters="#EmittenteRadioDelFato">
<balloon facs="#line14" type="speech" who="#EmittenteRadioDelFato"><p>Analoghe speranze anche per le <emph rendition="#b">uova</emph> e le <emph rendition="#b">patate</emph> grazie al'aumento della produzione.</p>
</balloon>
</panel>
<panel n="7" characters="#EmittenteRadioDelFato">
<balloon facs="#line15" type="speech" who="#EmittenteRadioDelFato"><p>Di primo mattino la polizia ha fatto irruzione in diciassette case della zona di Birmingham sgominando una pericolosa <emph rendition="#b">rete terroristica</emph>.</p>
</balloon>
<balloon facs="#line16" type="speech" who="#EmittenteRadioDelFato"><p>Venti persone, tra cui otto donne, sono attualmente detenute in attesa di giudizio.</p>
</balloon>
</panel>
<fw type="pageNum" place="lower-left">1</fw>
</div>
</body>
</text>
</TEI>
这是我生成html的xsl文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:cbml="http://www.cbml.org/ns/1.0">
<xsl:output method="html" version="4.0" indent="no"/>
<xsl:template match="/">
<xsl:text disable-output-escaping='yes'><!DOCTYPE html></xsl:text>
<html>
<head>
<title>
<xsl:value-of select="tei:fileDesc/tei:titleStmt/tei:title"/>
</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link type="text/css" rel="stylesheet" href="stile.css" />
</head>
<body>
<div>
<xsl:attribute name="class">inner-container</xsl:attribute>
<div>
<xsl:attribute name="id">corpo</xsl:attribute>
<xsl:apply-templates></xsl:apply-templates>
</div></div>
</body>
</html>
</xsl:template>
<xsl:template match="tei:teiHeader">
<div>
<xsl:attribute name="id">header</xsl:attribute>
<h1>
<xsl:attribute name="id">titolo</xsl:attribute>
<xsl:value-of select="tei:fileDesc/tei:titleStmt/tei:title"/>
</h1>
<h3>
<xsl:attribute name="id">resp-name</xsl:attribute>
<xsl:value-of select="tei:fileDesc/tei:titleStmt/tei:respStmt/tei:resp"/>
<xsl:value-of select="tei:fileDesc/tei:titleStmt/tei:respStmt/tei:name"/>
</h3>
</div>
<xsl:element name="div">
<xsl:attribute name="id">contenitore-tei-header</xsl:attribute>
<xsl:element name="div">
<xsl:attribute name="id">informazioni-codifica</xsl:attribute>
<h3 class="titolo-liste">Informazioni sulla codifica</h3>
<h5>
Titolo:
<xsl:value-of select="tei:fileDesc/tei:titleStmt/tei:title"/>
</h5>
<h5>
Codifica curata da:
<xsl:value-of select="tei:fileDesc/tei:titleStmt/tei:respStmt/tei:persName"/>
</h5>
<h5>
Publisher:
<xsl:value-of select="tei:fileDesc/tei:publicationStmt/tei:publisher"/>
</h5>
<h5>
Città:
<xsl:value-of select="tei:fileDesc/tei:publicationStmt/tei:pubPlace"/>
</h5>
<h5>
Data:
<xsl:value-of select="tei:fileDesc/tei:publicationStmt/tei:date"/>
</h5>
</xsl:element>
<xsl:element name="div">
<xsl:attribute name="id">informazioni-fumetto</xsl:attribute>
<h3 class="titolo-liste">Informazioni sul fumetto</h3>
<h5>
Titolo originale:
<xsl:value-of select="tei:fileDesc/tei:sourceDesc/tei:bibl/tei:title"/>
</h5>
<h5>
Autori:
<a href="item.php?id={ItemId}">
<xsl:value-of select="tei:fileDesc/tei:sourceDesc/tei:bibl/tei:author/tei:persName"/>
</a>
</h5>
<h5>
Casa editrice:
<xsl:value-of select="tei:fileDesc/tei:sourceDesc/tei:bibl/tei:publisher"/>
</h5>
<h5>
Città:
<xsl:value-of select="tei:fileDesc/tei:sourceDesc/tei:bibl/tei:pubPlace"/>
</h5>
<h5>
Data pubblicazione:
<xsl:value-of select="tei:fileDesc/tei:sourceDesc/tei:bibl/tei:date"/>
</h5>
</xsl:element>
<xsl:element name="div">
<xsl:attribute name="id">introduzione</xsl:attribute>
<h3 class="titolo-liste">Introduzione</h3>
<xsl:value-of select="tei:encodingDesc/tei:projectDesc"/>
</xsl:element>
</xsl:element>
</xsl:template>
<xsl:template match="tei:facsimile/tei:surface">
<xsl:element name="div">
<xsl:attribute name="id">contenitore-immagine</xsl:attribute>
<xsl:element name="img">
<xsl:attribute name="class">dimensioni</xsl:attribute>
<xsl:attribute name="src">
<xsl:value-of select="tei:graphic/@url" />
</xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:template>
<xsl:template match="tei:text">
<xsl:apply-templates></xsl:apply-templates>
</xsl:template>
<xsl:template match="tei:body/tei:div[@type='panelGrp']">
<xsl:element name="div">
<xsl:attribute name="id">contenitore-testo-annotato</xsl:attribute>
<xsl:element name="ul">
<xsl:attribute name="class">ul-testo-annotato</xsl:attribute>
<xsl:for-each select="cbml:panel">
<xsl:element name="li">
<xsl:attribute name="class">li-testo-annotato</xsl:attribute>
<xsl:element name="p">
<xsl:attribute name="class">p-testo-annotato</xsl:attribute>
<xsl:value-of select="cbml:balloon"/>
</xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
这是生成的html:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:cbml="http://www.cbml.org/ns/1.0"><head><title></title><meta http-equiv="content-type" content="text/html; charset=utf-8" /><link type="text/css" rel="stylesheet" href="stile.css" /></head><body><div class="inner-container"><div id="corpo">
<div id="header"><h1 id="titolo">Vi for Vendetta versione digitalizzata</h1><h3 id="resp-name">codifica</h3></div><div id="contenitore-tei-header"><div id="informazioni-codifica"><h3 class="titolo-liste">Informazioni sulla codifica</h3><h5>
Titolo:
Vi for Vendetta versione digitalizzata</h5><h5>
Codifica curata da:
Giulio Bambini</h5><h5>
Publisher:
Università di Pisa</h5><h5>
Città:
Pisa, Italia</h5><h5>
Data:
2015</h5></div><div id="informazioni-fumetto"><h3 class="titolo-liste">Informazioni sul fumetto</h3><h5>
Titolo originale:
Vi for Vendetta</h5><h5>
Autori:
<a href="item.php?id=">Alan Oswald Moore</a></h5><h5>
Casa editrice:
DC Comics </h5><h5>
Città:
Londra, Gran Bretagna</h5><h5>
Data pubblicazione:
1982</h5></div><div id="introduzione"><h3 class="titolo-liste">Introduzione</h3>
La seguente codifica con l'ausilio di Image Markup Tool ci permette di identificare il testo annotato sulle
immagini della Graphic Novel. All' interno del nostro elaborato i dialoghi sono stati evidenziati in corsivo e
sono stati inoltre raggruppati i nomi dei personaggi, delle organizzazioni e dei luoghi evidenziati nel testo.
</div></div>
<div id="contenitore-immagine"><img class="dimensioni" src="tavole/1.jpg" /></div>
<div id="contenitore-immagine"><img class="dimensioni" src="tavole/2.jpg" /></div>
<div id="contenitore-testo-annotato"><ul class="ul-testo-annotato"></ul></div>
<div id="contenitore-testo-annotato"><ul class="ul-testo-annotato"></ul></div>
</div></div></body></html>
我的问题是,我想生成带有altenated html标签的html结构(类似的东西......):
<div id="contenitore-immagine">
<div id="contenitore-testo-annotato">
<div id="contenitore-immagine">
<div id="contenitore-testo-annotato">
但是对于我当前的xsl,它带有这个错误的结构(它匹配所有元素而没有交替):
<div id="contenitore-immagine">
<div id="contenitore-immagine">
<div id="contenitore-testo-annotato">
<div id="contenitore-testo-annotato">
如何生成交替的html标签? 如何处理连接到相对图像的选定文本段?
答案 0 :(得分:3)
以下是我将如何解决这个问题:
为tei:text
定义一个空模板,以便处理不会自动流入它:
<xsl:template match="tei:text" />
使用源文档中的所有面板创建一个变量,以便您可以简明有效地访问它们:
<xsl:variable name="pannelli" select="/*/tei:text/tei:body/tei:div[@type='panelGrp']" />
处理传真表面时,确定文档中该表面的序号,并使用该序号将模板应用于关联的面板:
<xsl:template match="tei:facsimile/tei:surface">
<xsl:variable name="pos">
<xsl:number count="tei:facsimile/tei:surface" level="any"/>
</xsl:variable>
<div id="contenitore-immagine">
<img class="dimensioni" src="{tei:graphic/@url}"/>
</div>
<xsl:apply-templates select="$pannelli[number($pos)]" />
</xsl:template>
(与原始问题无关)对panelGrp模板进行一些改进和更正:
<xsl:template match="tei:body/tei:div[@type='panelGrp']">
<div id="contenitore-testo-annotato">
<ul class="ul-testo-annotato">
<xsl:apply-templates select="tei:panel" />
</ul>
</div>
</xsl:template>
<xsl:template match="tei:div[@type='panelGrp']/tei:panel">
<li class="li-testo-annotato">
<p class="p-testo-annotato">
<xsl:value-of select="tei:balloon"/>
</p>
</li>
</xsl:template>
完整解决方案:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:cbml="http://www.cbml.org/ns/1.0"
exclude-result-prefixes="tei cbml">
<xsl:output method="html" version="4.0" indent="no"/>
<xsl:template match="/">
<xsl:text disable-output-escaping='yes'><!DOCTYPE html></xsl:text>
<html>
<head>
<title>
<xsl:value-of select="tei:fileDesc/tei:titleStmt/tei:title"/>
</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link type="text/css" rel="stylesheet" href="stile.css" />
</head>
<body>
<div class="inner-container">
<div id="corpo">
<xsl:apply-templates/>
</div>
</div>
</body>
</html>
</xsl:template>
<xsl:template match="tei:teiHeader">
<div id="header">
<h1 id="titolo">
<xsl:value-of select="tei:fileDesc/tei:titleStmt/tei:title"/>
</h1>
<h3 id="resp-name">
<xsl:value-of select="tei:fileDesc/tei:titleStmt/tei:respStmt/tei:resp"/>
<xsl:value-of select="tei:fileDesc/tei:titleStmt/tei:respStmt/tei:name"/>
</h3>
</div>
<div id="contenitore-tei-header">
<div id="informazioni-codifica">
<h3 class="titolo-liste">Informazioni sulla codifica</h3>
<h5>
<xsl:value-of select="concat('Titolo: ', tei:fileDesc/tei:titleStmt/tei:title)"/>
</h5>
<h5>
<xsl:value-of select="concat('Codifica curata da: ', tei:fileDesc/tei:titleStmt/tei:respStmt/tei:persName)"/>
</h5>
<h5>
<xsl:value-of select="concat('Publisher:', tei:fileDesc/tei:publicationStmt/tei:publisher)"/>
</h5>
<h5>
<xsl:value-of select="concat('Città:', tei:fileDesc/tei:publicationStmt/tei:pubPlace)"/>
</h5>
<h5>
<xsl:value-of select="concat('Data: ', tei:fileDesc/tei:publicationStmt/tei:date)"/>
</h5>
</div>
<div id="informazioni-fumetto">
<h3 class="titolo-liste">Informazioni sul fumetto</h3>
<h5>
<xsl:value-of select="concat('Titolo originale: ', tei:fileDesc/tei:sourceDesc/tei:bibl/tei:title)"/>
</h5>
<h5>
<xsl:text>Autori: </xsl:text>
<a href="item.php?id={ItemId}">
<xsl:value-of select="tei:fileDesc/tei:sourceDesc/tei:bibl/tei:author/tei:persName"/>
</a>
</h5>
<h5>
<xsl:value-of select="concat('Casa editrice: ', tei:fileDesc/tei:sourceDesc/tei:bibl/tei:publisher)"/>
</h5>
<h5>
<xsl:value-of select="concat('Città: ', tei:fileDesc/tei:sourceDesc/tei:bibl/tei:pubPlace)"/>
</h5>
<h5>
<xsl:value-of select="concat('Data pubblicazione: ', tei:fileDesc/tei:sourceDesc/tei:bibl/tei:date)"/>
</h5>
</div>
<div id="introduzione">
<h3 class="titolo-liste">Introduzione</h3>
<xsl:value-of select="tei:encodingDesc/tei:projectDesc"/>
</div>
</div>
</xsl:template>
<xsl:template match="tei:text" />
<xsl:variable name="pannelli" select="/*/tei:text/tei:body/tei:div[@type='panelGrp']" />
<xsl:template match="tei:facsimile/tei:surface">
<xsl:variable name="pos">
<xsl:number count="tei:facsimile/tei:surface" level="any"/>
</xsl:variable>
<div id="contenitore-immagine">
<img class="dimensioni" src="{tei:graphic/@url}"/>
</div>
<xsl:apply-templates select="$pannelli[number($pos)]" />
</xsl:template>
<xsl:template match="tei:body/tei:div[@type='panelGrp']">
<div id="contenitore-testo-annotato">
<ul class="ul-testo-annotato">
<xsl:apply-templates select="tei:panel" />
</ul>
</div>
</xsl:template>
<xsl:template match="tei:div[@type='panelGrp']/tei:panel">
<li class="li-testo-annotato">
<p class="p-testo-annotato">
<xsl:value-of select="tei:balloon"/>
</p>
</li>
</xsl:template>
</xsl:stylesheet>