嗨,我在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
如果我使用给定参数的值,则仅显示锚标记内的值。有什么想法可以实现预期的行为吗?
谢谢。
答案 0 :(得分:0)
我不知道您的属性文件与XSLT有何关系,但是在您的XSLT中,您创建了一个带有属性节点text
的结果stringParam0
元素,您似乎想使用序列化的表示来填充其他结果元素中的元素(即xsl:copy-of select="$notification-sender"
可以尝试这样做)。但是,属性值是根据select
表达式或序列构造函数(https://www.w3.org/TR/xslt20/#creating-attributes,https://www.w3.org/TR/xslt20/#constructing-simple-content)的字符串构造而成的,因此,除非有任何XML标记出现在属性值中,否则您不能指望您将其明确放置在那里。
如果可以,请移至XSLT 3(在开源Saxon HE 9.8或9.9支持的Java世界中)并在
中使用XPath 3serialize
函数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/