【问题标题】:Using RegEx in XSLT在 XSLT 中使用正则表达式
【发布时间】:2008-12-04 13:49:16
【问题描述】:

我需要解析 Visual Studio 自动生成的 XML 文档来创建报告。我决定使用 XSLT,但我对它很陌生,需要帮助。 常用模板为:

<doc>
  <members>
    <member name="F:MyNamespace">
      <summary>Some text</summary>
    </member> 
  </members>
</doc>

我想隔离名称以某个单词开头的成员,例如 P:Interfaces.Core。我决定在 select 语句中使用 RegExp。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:fn="http://www.w3.org/TR/xpath-functions/">
    <xsl:template match="/" >
        <html xmlns="http://www.w3.org/1999/xhtml">
            <body style="font-family:Tahoma">
                <p>Interfaces list:</p>
                <table>
                    <xsl:for-each select="doc/members/member">
                        <xsl:sort order="ascending" />
                        <xsl:value-of select="fn:matches(., 'P\..+')" />
                        <br />
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

为什么会出错:

命名空间http://www.w3.org/TR/xpath-functions不包含任何函数>

我哪里错了?我在示例中找到了这样的代码,包括 w3c.org!

【问题讨论】:

  • Abatishchev,看我的回答。在此时的所有答案中,只有这一个为您提供了要使用的确切 XPath 表达式。它还讨论了其他可用选项,演示了其他可用 XPath 1.0 函数的使用以及如何将 ends-with() 实现为 XPath 1.0 表达式。干杯

标签: xml regex xslt


【解决方案1】:

如果您使用 Visual Studio X 执行转换,其中 X 不大于 2008,这将由 XSLT 1.0 处理器(.NET 的 XslCompiledTransform 或 @987654323 @)。 XSLT 1.0 使用 XPath 1.0,而不是 XPath 2.0 及其 F & O(函数和操作),后者去年才成为 W3 建议。

您有两种选择

  1. 使用兼容的 XSLT 2.0 处理器。如果您更喜欢留在 .NET 平台中,那么合适的选择是Saxon.NET

  2. 只要使用 XPath 1.0 功能starts-with(),就足以解决当前的问题。
    如果上下文节点的字符串值以字符串“P:Interfaces”开头,则表达式:starts-with(., 'P:Interfaces') 计算为 true(),否则计算为 false()

另一个对此类处理可能派上用场的 Xpath 1.0 函数是函数 contains()

Xpath 2.0 的函数ends-with() 可以通过以下方式在 XPath 1.0 中模拟:

ends-with(s1, s2) ====substring(s1,string-length(s1)-string-length(s2)+1)=s2

其中“===”表示“等效于”。

这里我们还使用了 XPath 1.0 函数 substring()string-length()

【讨论】:

  • 嗨!非常感谢您的回答!我已经完成了你所说的事情——我的意思是 XPath 1.0,我完全按照你说的使用了——开始于(@name, 'T:MyNamespaces.Interfaces') 和 contains()。
【解决方案2】:

如果您只使用 MS XML,您可以添加以您选择的 .net 语言编写的自定义函数。请参阅MSDN 上的示例(他们使用 JScript)。然后你可以使用正则表达式。

但是,您应该能够使用starts-with xslt 函数来完成您需要的操作。

【讨论】:

【解决方案3】:

这些函数来自 XSLT 2.0 中的 XPath 2.0。 .NET XSLT 为 1.0,您的 xsl 命名空间反映了这一点。

【讨论】:

    【解决方案4】:

    然而,.net 有一个 outofjail.get():总是有可能将任务传递给 Extension Object

    不是很好的做法,因为它是 XSLT 的扩展,但有时您必须选择可行的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多