XSL html标记未在属性文件的参数化字符串中呈现为html

时间:2018-10-19 14:36:36

标签: html xslt-2.0

嗨,我在xslt2.0的属性文件中的参数化字符串值中渲染某个元素时遇到问题。

我有一个属性文件,其属性如下:

user.no_reply=Add {0} to your address book to make sure that you receive our notifications

我的模板:

<xsl:template name="disclaimer">

    <xsl:param name="notification-sender"/>

    <text type="text">
        <xsl:attribute name="stringParam0">
            <xsl:copy-of select="$notification-sender"/>
        </xsl:attribute>
        <xsl:text>user.no_reply</xsl:text>
    </text>
</xsl:template>

还有我希望传递给模板的参数。

<xsl:call-template name="disclaimer">
                    <xsl:with-param name="notification-sender">
                        <text type="link" new-line="false">
                            <xsl:attribute name="href">mailto:<xsl:value-of select="notificationSender"/>
                            </xsl:attribute>

                            <xsl:attribute name="style">
                                <xsl:value-of select="'text-decoration: underline; color: #868686'"/>
                            </xsl:attribute>

                            <xsl:value-of select="notificationSender"/>
                        </text>
                    </xsl:with-param>
</xsl:call-template>

输出是这样的:

  

添加到您的地址簿中,以确保您收到我们的   通知

电子邮件未填充,因此参数在其中留有空白。

我希望在字符串中包含完整的html:

Add <a href="mailto:whatever" style="text-decoration: underline; color: #868686">whatever</a>  to your address book to make sure that you receive our notifications

如果我使用给定参数的值,则仅显示锚标记内的值。有什么想法可以实现预期的行为吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

我不知道您的属性文件与XSLT有何关系,但是在您的XSLT中,您创建了一个带有属性节点text的结果stringParam0元素,您似乎想使用序列化的表示来填充其他结果元素中的元素(即xsl:copy-of select="$notification-sender"可以尝试这样做)。但是,属性值是根据select表达式或序列构造函数(https://www.w3.org/TR/xslt20/#creating-attributeshttps://www.w3.org/TR/xslt20/#constructing-simple-content)的字符串构造而成的,因此,除非有任何XML标记出现在属性值中,否则您不能指望您将其明确放置在那里。

如果可以,请移至XSLT 3(在开源Saxon HE 9.8或9.9支持的Java世界中)并在

中使用XPath 3 serialize函数https://www.w3.org/TR/xpath-functions/#func-serialize
<xsl:attribute name="stringParam0" select="serialize($notification-sender)"/>

或者当然直接在

<text type="text" stringParam0="{serialize($notification-sender)}">..</text>

对于XSLT 2,您将需要检查XSLT 2处理器是否支持类似于XSLT / XPath 3.0 serialize函数的扩展,或者您需要自己实现或使用现有的库,例如http://lenzconsulting.com/xml-to-string/