使用XSLT将斜体从XML转换为HTML

时间:2015-09-16 07:03:41

标签: xml xslt

我目前正在学习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。如果有人能帮助我,我将非常感激。

2 个答案:

答案 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>

对我来说,当我尝试它时它起作用了。