2010-11-08 64 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')