【问题标题】:xslt to operate on element value before displaying?xslt 在显示之前对元素值进行操作?
【发布时间】:2015-05-10 06:52:22
【问题描述】:

右侧xsl的默认行为

http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog

是在左侧的 XML 中显示一个 2 列表,其中包含每张 CD 的标题和艺术家。 (这显示在底部“您的结果”下的默认输出中。)

我想修改 xsl 以了解如何将 xsl 函数应用于从 XML 元素返回的文本。 (这里是whole list of xsl string functions。)例如,有一个函数 fn:upper-case(string) 会将字符串转换为大写。

那么,对there 所示的 xsl 进行最小修改会产生相同的表,但 CD 标题全部为大写?

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    upper-case 是 XSLT 2.0 函数。如果您碰巧有一个 2.0 样式表(示例中没有)和引擎来转换它,那么使用它就像这样简单:

    <xsl:value-of select="upper-case(title)"/>
    

    但是,在更常见的 1.0 中,您最好的计划是使用以下之一:

    • 自定义扩展(平台不同)
    • 繁琐的 xslt 转换函数为 translate(title,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ'),这对于 I18N 来说很粗糙且有问题
    • CSS 的简单 text-transform:uppercase;(通常是最好的解决方案,因为这通常是样式问题而不是数据问题)

    【讨论】:

    • 对原始页面 XSL 代码应用此“CSS 的简单文本转换:大写;”的最小更改是什么解决方案?
    【解决方案2】:

    更新:仅适用于支持 XPath 2.0 的处理器。

    我认为以下内容应该可以满足您的需求...不要忘记声明 fn 命名空间 (xmlns:fn=...) 或根本不声明任何命名空间。

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!-- Edited by XMLSpy® -->
    <xsl:stylesheet version="1.0"
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
       xmlns:fn="http://www.w3.org/2005/xpath-functions">
    
    <xsl:template match="/">
      <html>
      <body>
      <h2>My CD Collection</h2>
        <table border="1">
          <tr bgcolor="#9acd32">
            <th>Title</th>
            <th>Artist</th>
          </tr>
          <xsl:for-each select="catalog/cd">
          <tr>
            <td><xsl:value-of select="fn:upper-case(title)"/></td>
            <td><xsl:value-of select="artist"/></td>
          </tr>
          </xsl:for-each>
        </table>
      </body>
      </html>
    </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

    • XPath 1.0 中没有upper-case(因此在 XSLT 1.0 中)。
    • 让我检查一下,这个样式表在 Saxon-B 9.1.0.6 下工作正常
    • 是的,帕维尔当然是正确的。这些函数在 XPath 2.0 中可用,所以我怀疑 w3schools 站点上没有。如果您使用符合 XPath 2.0 的处理器,则可以按上述方式使用它们。否则,您需要自己构建一个函数。
    • 正如我所提到的,传统上翻译一直依赖于此,但它有点像贫民窟
    • 不知道@annakata。认为这些信息值得我投赞成票:)
    【解决方案3】:

    由于该页面上的 XSL 是version="1.0",您可以更改此行

    <td><xsl:value-of select="title"/></td>
                              ^^^^^
    

    到这里:

    <td><xsl:value-of select="translate(title, 'abcdefghijklnmopqrstuvwxyz', 'ABCDEFGHIJKLNMOPQRSTUVWXYZ')"/></td>
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    

    尽管使用支持 XPath 2.0 的处理器,您应该可以改用它:

    <td><xsl:value-of select="upper-case(title)"/></td>
                              ^^^^^^^^^^^^^^^^^
    

    【讨论】:

    • 非常感谢对 XPath 和 XSLT 1.0 和 2.0 版本的讨论(这样我才知道这些版本存在)。但我接受了这个最简单的答案,因为(a)它似乎是我提出的问题的正确答案,并且(b)它适用于我给出的页面。但感谢所有响应者!
    • 此外,这个答案让我非常清楚如何将函数调用插入到元素名称的 select 语句中。也就是说,从片段 select="title" 开始,我并不清楚将函数名称及其括号放在哪里。现在很清楚了。
    • 我想我不能编辑早期的 cmets?因此,更新我的第一条评论,我发现这个答案也简要介绍了 2.0 版。这个答案简短,简洁且正确。这就是我接受它的原因。
    【解决方案4】:

    您提供的函数列表的链接适用于 XPath 2.0、XSLT 2.0 和 XQuery 1.0。您链接到的样式表是 XSLT 1.0,它不支持大多数这些功能。特别是不支持upper-case()

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多