2008-12-04 46 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的擴展,但有時您必須採取行之有效的做法。