【问题标题】:XSL: translate() with html in replacing stringXSL: translate() 用 html 替换字符串
【发布时间】:2011-05-02 08:13:38
【问题描述】:

我有一个看起来像这样的 xml 文档。

<?xml version="1.0"?>
<services>
    <service sn="1" family="2 Week Wait">
    <service_name>2 Week Wait Dermatology</service_name>
    <speciality>2 Week Wait</speciality>
    <clinic_types>2 Week Wait Skin</clinic_types>
    <tag>Malignant neoplasm of skin , Pigmented skin lesion </tag>
</service>

我已经设法得到了我想要的一切,但最后一次调整我想让逗号分隔值显示为无序列表。

我正在使用这行XSL来输出列表,

<ul>
     <li>
           <xsl:value-of select="translate(tag,',','<![CDATA[</li><li>]]>')" disable-output-escaping="yes" />
     </li>
<ul>

我收到一条错误消息,指出生成的 XML 格式不正确。我试图用其他东西替换替换部分并且它有效。我也尝试过使用 HTML ASCII 代码作为标签,但没有成功,所以我真的对自己做错了什么感到困惑。

任何帮助表示赞赏, 谢谢

【问题讨论】:

标签: xml xslt csv translate


【解决方案1】:

XSLT 是 XML; select 表达式嵌入在属性值中,因此它必须应用另一轮 XML 转义。由于 CDATA 部分不能存在于属性值中,因此必须手动应用:

<xsl:value-of select="translate(tag,',','&lt;/li>&lt;li>')" disable-output-escaping="yes" />

但是,将disable-output-escaping 应用于translate 的输出是有问题的:如果文本中有&lt;&amp; 字符怎么办?您会将文本内容变成活动标记,存在有效性和潜在的安全问题。

通常最好从 XSLT 本身添加标记。您可以使用 tokenize 函数在 XSLT 2.0 中拆分字符串:

<ul>
    <xsl:for-each select="tokenize(tag,',')">
        <li><xsl:value-of select="."/></li>
    </xsl:for-each>
</ul>

(如果您使用的是 XSLT 1.0,则必须使用 substring_before/after 作为递归模板来完成,这很痛苦。)

【讨论】:

  • 'tokenize' 不是有效的 XSLT 或 XPath 函数。-->tokenize(tag,',')
  • 哎呀发送得太早了,是的,看来我必须做递归模板的事情。
  • 耻辱!有关如何完成的示例,请参阅 this answer
【解决方案2】:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:template match="tag">
        <ul>
                <xsl:for-each select="tokenize(.,',')">
                    <li><xsl:value-of select="."/></li>
                </xsl:for-each>
            </ul>
</xsl:template>

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

</xsl:stylesheet>

【讨论】:

  • 2 周等待皮肤科2 周等待 2周等待皮肤
      • 皮肤恶性肿瘤
      • 色素沉着
      • 皮肤
      • 病变
      abhay
  • 请不要重复已经给出的答案。更不用说您的样式表声明了 version="1.0" 但需要 XSLT 2.0(正如另一个答案中正确说明的那样)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 2012-02-16
  • 1970-01-01
相关资源
最近更新 更多