2010-11-08 58 views
4

我使用XMLSpy的使用以下XSLT:XSLT較低的情況下,使用.NET

<?xml version="1.0" encoding="UTF-16"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-16" indent="yes"/> 
     <xsl:template match="*"> 
     <xsl:element name="{lower-case(local-name())}"> 
      <xsl:apply-templates select="@*"/> 
      <xsl:apply-templates select="* | text()"/> 
     </xsl:element> 
    </xsl:template> 
    <xsl:template match="@*"> 
     <xsl:attribute name="{lower-case(local-name())}"><xsl:value-of select="."/></xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

如果我嘗試使用它在我的源代碼(XslCompiledTransform)我得到一個異常告訴我「的功能較低case()'不是XSLT合成器的一部分。

所以我改變了改造一點點:

fn:lower-case 

現在我的例外是,腳本或「http://www.w3.org/2005/xpath-functions」前綴可以外部對象不被發現。 這裏有什麼問題?我該如何解決它?

問候

+0

你可以發佈你與轉化的代碼?你是否正在創建一個NameTable並用正確的命名空間填充它? – Oded 2010-11-08 15:18:54

+0

@Jaster:這是一個XSLT 2.0樣式表。我認爲XMLSpy使用Altova XSLT 2.0處理器,這很好。但是,你提到XslCompiledTrandform ...你是否在「純」.NET中運行這種轉換?這有一個XSLT 1.0處理器。 – 2010-11-08 15:34:44

+0

好問題,+1。請參閱我的答案以獲得解釋和完整的XSLT1.0/XPath1.0解決方案。 :) – 2010-11-08 15:35:33

回答

3

.NET不執行XSLT 2.0/2.0的XPath。

在XPath 1.0可以使用下面的表達式,而不是lower-case()

translate(yourString, 
      'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
      'abcdefghijklmnopqrstuvwxyz')