-1

我无法通过 XSLT 在 HTML 中正确格式化 XML 数据。以下是接收数据的方式:

    This is some text. <p> 
    This is more text. <p> 
    This is even more text. <p>
    <a href=www.google.com>Google's website</a> <p> 
    Return to my website.

所以我有递归(我认为这是在这种情况下使用的)设置。它将为每个 p 标签创建一个新段落,并删除我们网站上的 p 标签。这是代码:

<xsl:template name="replace_p">
    <xsl:param name="text"/>
    <xsl:choose>
        <xsl:when test="contains($text, '&lt;P&gt;')">
            <xsl:value-of select="substring-before($text, '&lt;P&gt;')"/>
             <br/><br/>
            <xsl:call-template name="replace_p">
                <xsl:with-param name="text" select="substring-after($text, '&lt;P&gt;')"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$text"/>
        </xsl:otherwise>
    </xsl:choose>

这很好用……除非我们有链接。我希望用户能够点击链接而不是看到 a href 标记和代码。唯一的问题是......当替换 p 模板运行时我该怎么做。我的尝试(我觉得我的想法是正确的,虽然可能不是很接近):

    <xsl:template name="replace_p">
    <xsl:param name="text"/>
    <xsl:if test="contains($text, '&lt;P&gt;')">
        <xsl:choose>
            <xsl:when test="substring-before($text, '&lt;P&gt;') and substring-before($text, '&lt;a href=')">
                <xsl:value-of select="substring-before(substring-after($text, '&lt;a href='), '&gt;')"/>
                <br/><br/>
                <xsl:call-template name="replace_p">
                    <xsl:with-param name="text" select="substring-after($text, '&lt;P&gt;')"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:when test="substring-before($text, '&lt;P&gt;')">
                <xsl:value-of select="substring-before($text, '&lt;P&gt;')"/>
                <br/><br/>
                <xsl:call-template name="replace_p">
                    <xsl:with-param name="text" select="substring-after($text, '&lt;P&gt;')"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$text"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:if>
</xsl:template>

我先测试 p 标签和 href 标签测试,因为我希望它在进入下一个 when 语句之前检查两者。但是......我不知道它是否一定是这样工作的。它会在进入下一个 when 语句之前检查第一个 p 标签和一个 href 标签吗?

我也知道我需要创建一个标签和一个 href 属性,但我想努力让正确的数据首先出现。:)

如果需要任何其他信息,请告诉我。

谢谢!

4

2 回答 2

1

您的问题是您试图通过将其视为文本来转换非法 xml。

如果您正在处理纯文本,还有比 xslt 更适合该工作的其他技术。如果您不转换(合法)xml,请不要使用 xslt,这没有任何意义。

如果你真的想使用 xslt,首先要确保你有合法的 xml。然后,使用模板和选择器以及 xslt 和 xpath 的所有细节都很容易。

只是为了好玩,请参阅本文的介绍以了解您在问什么。

于 2012-05-31T20:51:04.493 回答
0

这对你有帮助吗?

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates/>
<xsl:call-template name="replace_p"/>
</xsl:template>

<xsl:template name="replace_p">
 <xsl:param name="text" select="tokenize(unparsed-text('Try2.txt'), '\r?\n')"/>
 <xsl:for-each select="$text">

 <p>
 <xsl:choose>
 <xsl:when test="(substring-after(normalize-space(.), '&lt;a href=') != '')">
 <xsl:element name="a">
 <xsl:attribute name="href">
 <xsl:value-of select="concat('http://', substring-before(substring-after(., '&lt;a href='), '&gt;'))"/>
 </xsl:attribute>
 <xsl:value-of select="substring-before(substring-after(., '&gt;'), '&lt;/a&gt;')" disable-output-escaping="no"/>
 </xsl:element></xsl:when>
 <xsl:when test="((substring-before(normalize-space(.), '&lt;p&gt;')) != '')">
 <xsl:value-of select="(substring-before(normalize-space(.), '&lt;p&gt;'))"/>
 </xsl:when>
 <xsl:otherwise>
 <xsl:value-of select="normalize-space(.)"/>
 </xsl:otherwise>
</xsl:choose>
 </p>
 </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

输出是[代码]

<xml>
<p>This is some text. </p>
<p>This is more text. </p>
<p>This is even more text. </p>
<p><a href="http://www.google.com">Google's website</a></p>
<p>Return to my website.</p>
</xml>

[/代码]

于 2013-07-22T07:36:41.187 回答