我目前正在学习XSLT,我觉得这并不容易。我在将段落的一部分标记从XML转换为HTML时遇到问题。我有这种XML:
<TEI>
<teiHeader>
<edition>
<graphic url="#">
<desc>Grabado calcográfico de José Ximeno y Bartolomé Vázquez <hi rend="italics">La fuerza de la sangre</hi>, edición de las <hi rend="italics">Novelas ejemplares</hi> impresa por Antonio de Sancha en Madrid, 1783.</desc>
</graphic>
</edition>
<profileDesc>
<abstract>
<p><seg rend="italics">La fuerza de la sangre</seg> es una de las novelas más breves y más enigmáticas de Miguel de Cervantes. Sexta entre las doce <seg rend="italics">Novelas ejemplares</seg> (1613).</p>
</abstract>
</profileDesc>
</teiHeader>
</TEI>
我想将一些信息传递给HTML(图形事物),但其他我不知道(抽象)。为了将其转换为HTML,我尝试了几次XSLT样式表,如:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template
match="text()"/>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link href="../Styles/estilos.css" rel="stylesheet" type="text/css" />
<title>Información</title>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="graphic//desc">
<p class="title">
<xsl:apply-templates />
</p>
</xsl:template>
<xsl:template match="hi[@rend='italics']">
<i>
<xsl:apply-templates />
</i>
</xsl:template>
</xsl:stylesheet>
但是,这并没有打印文本,它的确如下:
<p xmlns="" class="title">
<i></i>
<i></i>
</p>
你可以想象,我想要的是:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link href="../Styles/estilos.css" rel="stylesheet" type="text/css" />
<title>Información</title>
</head>
<body>
<p>Grabado calcográfico de José Ximeno y Bartolomé Vázquez <i>La fuerza de la sangre</i>, edición de las <i>Novelas ejemplares</i> impresa por Antonio de Sancha en Madrid, 1783.</p>
</body>
</html>
我在这里搜索了一些接近的问题,并且有一些类似的主题,我已经尝试了但是我没有得到我的xml转换成我想要的html。如果有人能帮助我,我将非常感激。
答案 0 :(得分:1)
删除禁止所有文本的模板:
<xsl:template
match="text()"/>
或缩小它以排除您要保留的文本节点:
<xsl:template match="text()[not(ancestor::desc)]"/>
或覆盖您要保留的文本节点 - 即添加:
<xsl:template match="text()[ancestor::desc]">
<xsl:value-of select="."/>
</xsl:template>
响应您的修改:
恕我直言,这里更好的策略是有选择地应用模板。然后你根本不需要压制文本节点:<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:template match="/TEI">
<html>
<head>
<link href="../Styles/estilos.css" rel="stylesheet" type="text/css" />
<title>Información</title>
</head>
<body>
<xsl:apply-templates select="teiHeader/edition/graphic/desc"/>
</body>
</html>
</xsl:template>
<xsl:template match="desc">
<p class="title">
<xsl:apply-templates />
</p>
</xsl:template>
<xsl:template match="hi[@rend='italics']">
<i>
<xsl:apply-templates />
</i>
</xsl:template>
</xsl:stylesheet>
还要注意默认命名空间的处理。
答案 1 :(得分:0)
与text()匹配的模板为空,因此不执行任何操作。试试这个:
<xsl:template match="text()">
<xsl:value-of select="."/>
</xsl:template>
对我来说,当我尝试它时它起作用了。