2

我目前在进行 XML/XSLT 到 HTML 的转换时遇到了一些麻烦。简而言之,我想<br />在一个 XML 标签内使用标签,这样转换后的 HTML 文件就会显示一个换行符。经过一些尝试,我得到了它的工作,但是以其他一些功能为代价。即突出部分的能力。

首先是转储下来的 XML 文件。所以基本上,有几个可能的标签都包含名字和姓氏。在这种情况下,我希望在单独的行上解析名字和姓氏(因此是<br />标签)。此外,在某些情况下,需要突出显示名字或姓氏。在这种情况下,在第 3 行,姓氏“The Hand”。

<swift_native>
<tag tag_code=":1:"><![CDATA[Jaco<br />Ronnie]]></tag>
<tag tag_code=":2:"><![CDATA[John<br />Doe]]></tag>
<tag tag_code=":2:"><![CDATA[Robbie<br />]]><highlight>The Hand</highlight></tag>
</swift_native>

到目前为止,根据我在 XSLT 中使用的方法,我可以使换行符正确或突出显示。但不是两者兼而有之:下图显示了这一点。

输出 下面是使用的 XSLT 文件。您可以在哪里看到 using<xsl:apply-templates/>将使突出显示工作并<xsl:value-of select="." disable-output-escaping="yes"/>让我<br />正确使用。

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- HTML Layout definition -->
<xsl:output method="html"/>
<xsl:template match="swift_native">

    <html>
        <head>
            <title>
                <xsl:apply-templates select="message_id"/>
            </title>
            <style type="text/css">
                #tbl1,#tbl2 {display:none;}
                #lnk1,#lnk2   {border:none;background:none;width:85px;}
                td {FONT-SIZE: 75%; MARGIN: 0px; COLOR: #000000;}
                td {FONT-FAMILY: verdana,helvetica,arial,sans-serif}
                a {TEXT-DECORATION: none;}
                table.subtable {border-collapse:collapse;}
                table.subtable td {border:1px solid black;}
            </style>
        </head>
        <body>
            <table cellpadding="3" width="100%" class="subtable">
                <tr bgcolor="#cccccc">
                    <td colspan="3">Block4</td>
                </tr>
                <xsl:apply-templates select="tag" />
            </table>
        </body>
    </html>
</xsl:template>

<!-- Variable definition -->

<xsl:template match="tag">
    <tr>
        <td>
            <b>
                <xsl:value-of select="@tag_code" />
            </b>
        </td>
        <td>
            <xsl:value-of select="." disable-output-escaping="yes"/>
        </td>
        <td>
            <xsl:apply-templates/>
        </td>
    </tr>
</xsl:template>

<xsl:template match="highlight">
    <span style="background-color:yellow;">
        <xsl:apply-templates/>
    </span>
</xsl:template>

</xsl:stylesheet>

显然,问题是:有人知道我可以同时使用<br />标签和突出显示的方式吗?

4

4 回答 4

2

CDATA告诉处理器将内容解释为纯文本,而不是标记。这就是为什么disable-output-escaping需要防止<br/>显示为&lt;br/&gt;.

如果你想利用disable-output-escaping,你必须打破你选择标签内容的方式。

添加模板

<xsl:template match="tag/text()">
    <xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>

并将value-of行更改为

<xsl:apply-templates select="text()|*"/>
于 2013-01-28T17:44:24.923 回答
1

这里的一种解决方案是同时使用两者:

<xsl:template match="tag">
    <tr>
        <td>
            <b>
                <xsl:value-of select="@tag_code" />
            </b>
        </td>
        <td>
            <xsl:apply-templates/>
        </td>
    </tr>
</xsl:template>

<xsl:template match="tag//text()">
    <xsl:value-of select="." disable-output-escaping="yes" />
</xsl:template>

<xsl:template match="highlight">
    <span style="background-color:yellow;">
        <xsl:apply-templates />
    </span>
</xsl:template>

但是请注意,如果您这样做,您需要确保<tag>节点内的任何文本值在 CDATA 中正确转义,并在其外部进行双重转义,也就是说,而不是

<tag tag_code=":2:"><![CDATA[Robbie & Bobbie <br />]]><highlight> &amp; The Hand</highlight></tag>

你需要有:

<tag tag_code=":2:"><![CDATA[Robbie &amp; Bobbie<br />]]><highlight> &amp;amp; The Hand</highlight></tag>

<tag>因此,如果元素有可能包含 XML 特殊字符,这可能不是一个好方法。

如果您可以确保直接位于下方的文本<tag>始终位于 CDATA 中,并且较低节点(例如<highlight>s)中的任何内容都不会,那么它会稍微简单一些。您可以用这个替换上面的文本匹配模板:

<xsl:template match="tag/text()">
    <xsl:value-of select="." disable-output-escaping="yes" />
</xsl:template>

然后您只需要确保 CDATA 中的内容被正确转义,并且其他任何内容都只是有效的 XML。

最后,如果您对源数据有一定的控制权,则应考虑放弃 CDATA 并仅在以下内容中拥有<br />权利<tag>

<tag tag_code=":2:">Robbie<br /><highlight>The Hand</highlight></tag>

然后你可以使用这个 XSL,它比任何使用的东西都要健壮得多disable-output-escaping

<xsl:template match="tag">
    <tr>
        <td>
            <b>
                <xsl:value-of select="@tag_code" />
            </b>
        </td>
        <td>
            <xsl:apply-templates/>
        </td>
    </tr>
</xsl:template>

<xsl:template match="tag/@* | tag/node()">
   <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
   </xsl:copy>
</xsl:template>

<xsl:template match="highlight">
    <span style="background-color:yellow;">
        <xsl:apply-templates />
    </span>
</xsl:template>
于 2013-01-28T17:48:49.173 回答
1

令人高兴的是,也有一个简单的解决方案。只需将此行添加到您的 xsl 文件中:

<xsl:template match="br"><br/></xsl:template>  

这样,无需将数据包装到 CDATA 中,而是使用更直观的方法:

<tag tag_code=":1:">Jaco<br/>Ronnie</tag>

同样,可以包括其他常见的简单 HTML 标记。这是一个将粗体、斜体等链接到 CSS 样式的示例,但是每个(如上)的单行也可以:

<xsl:template match="i|b|u|strong">
    <span>
        <xsl:attribute name="class">html_<xsl:value-of select="name(.)" /></xsl:attribute>
        <xsl:apply-templates />
    </span>
</xsl:template>

如果您发现自己经常这样做,请将它们全部复制到 html.xsl 并xsl:include在需要时使用它们。

于 2017-01-04T20:39:01.737 回答
-2

如果你想做在 html 中是

您需要的只是在 XLS 中制作:

<br></br>
于 2019-07-12T12:38:26.387 回答