2008-12-04 44 views
4

我需要解析Visual Studio自动生成的XML文档以创建报告。我决定使用XSLT,但我很新,需要帮助。 常见的模板是:在XSLT中使用RegEx

<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> 

为什么我得到错误:

Namespace http://www.w3.org/TR/xpath-functions does not contain any functions >

我在哪里错了?我在例子中发现了这样的代码,包括w3c.org!

+0

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

回答

8

如果你正在使用Visual Studio X,其中X为不超过2008年进行较大的改造,这将通过XSLT 1.0处理器来处理(.NET的XslCompiledTransformXslTransform)。 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”开头并且以其他方式以false()开头,则表达式:starts-with(., 'P:Interfaces')被评估为true()

对于这种类型的处理可能非常方便的另一个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()

+0

嗨!非常感谢您的回答! 我已经完成了一些类似于你正在谈论的事情 - 我的意思是XPath 1.0,我完全按照你所说的 - 开始 - (@name,'T:MyNamespaces.Interfaces')和contains()。 – abatishchev 2008-12-04 21:21:29

0

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

2

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

但是,您应该可以使用starts-with xslt函数来执行您所需的操作。

+0

MS的XSLT实现不支持2.0函数。您必须使用像Saxon这样的外部XSLT库。更多信息在这里:http://stackoverflow.com/questions/94047/are-net-35-xpath-classes-and-methods-xslt-20-compatible – Will 2008-12-04 14:54:47

0

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

不是很好的做法,因为它是对XSLT的扩展,但有时您必须采取行之有效的做法。