.net 以字符串形式检索XSLT代码-“;“路径中的非法字符”;
我想转换一个XML文档。我的XSLT代码工作正常,并且转换正确(在XMLPad中测试),但现在我想在VB.NET程序中对其进行转换。 问题是我不想从.net 以字符串形式检索XSLT代码-“;“路径中的非法字符”;,.net,xml,vb.net,xslt,xslt-1.0,.net,Xml,Vb.net,Xslt,Xslt 1.0,我想转换一个XML文档。我的XSLT代码工作正常,并且转换正确(在XMLPad中测试),但现在我想在VB.NET程序中对其进行转换。 问题是我不想从.xsl文件加载XSLT代码。我在一个函数中硬编码了它,但我在路径异常中得到了非法字符 有没有可能这样做: Public Class xsltTransformCode Public Function transformationXSLTcode() As String Return "<xsl:stylesheet x
.xsl
文件加载XSLT代码。我在一个函数中硬编码了它,但我在路径异常中得到了非法字符
有没有可能这样做:
Public Class xsltTransformCode
Public Function transformationXSLTcode() As String
Return "<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>" &
"<xsl:strip-space elements='*'/>" &
"<xsl:output method='xml' indent='yes'/>" &
"<xsl:key name='AreaByPosition' match='Area' use='Position'/>" &
"<xsl:template match='@*|node()'>" &
"<xsl:copy><xsl:apply-templates select='@*|node()'/></xsl:copy>" &
"</xsl:template>" &
"<!-- for the first Area in each Position -->" &
"<xsl:template match='Area[generate-id() = generate-id(key('AreaByPosition', Position)[1])]'>" &
"<Area>" &
"<!-- copy in the Position element once only -->" &
"<xsl:apply-templates select='Position'/>" &
"<!-- copy in all sub-elements except Position from all matching Areas -->" &
"<xsl:apply-templates select='key('AreaByPosition', Position)/*[not(self::Position)]'/>" &
"</Area>" &
"</xsl:template>" &
"<!-- ignore all other Area elements -->" &
"<xsl:template match='Area'/>" &
"</xsl:stylesheet>"
End Function
End Class
查看单引号的组合,例如:
<xsl:apply-templates select='key('AreaByPosition', Position)/*[not(self::Position)]'/>
我建议对xml属性使用双引号,对文字使用单引号;由于这是VB字符串的一部分,因此需要将双引号加倍以转义它们,即
"<xsl:apply-templates select=""key('AreaByPosition', Position)/*[not(self::Position)]""/>" &
“”&
(多个位置等,而不仅仅是这一行)您具有此匹配属性
match='Area[generate-id() = generate-id(key('AreaByPosition', Position)[1])]'
它在单个带引号的字符串中包含单个带引号的字符串
不幸的是,你不能这样做,你将不得不逃避内部引用。恐怕我不知道;我不知道如何在VB中执行此操作。例如,下面的行不正确:
"<xsl:template match='Area[generate-id() = generate-id(key('AreaByPosition', Position)[1])]'>"
但从VisualBasic的角度来看,这不起作用。你必须避开引号。
因此,请尝试:
"<xsl:template match='Area[generate-id() = generate-id(key(\"AreaByPosition\", Position)[1])]'>"
“”
但是我不确定visual basic中的esacping是否正确,我只是怀疑地查看了MSDN以进行确认,它验证了您不能将实际的XML字符串传递给XslCompiledTransform.Load函数。这个字符串版本需要一个URI,因此抱怨“路径中的字符不正确”
但是,您可以使用XMLReader加载XML:
Dim xsltTransformerCode As New xsltTransformCode()
Dim sr as new System.IO.StringReader(xsltTransformerCode.transformationXSLTcode())
Dim xr as XmlReader = XmlReader.Create(sr)
Dim xsltTransCompiled As New XslCompiledTransform()
xsltTransCompiled.Load(xr)
这是从一些c代码匆忙转换而来的,我相信如果它不能正常工作,你可以修改它
Mark我尝试过这样做(将xml属性更改为前面带有转义字符的双引号),并将所有单引号更改为带有转义字符的双引号,但仍然出现相同的问题。@Syspect哦,对-是的,您需要将此与Mark Rabjohn回答中的XmlReader
结合起来。一段代码中有2组错误;优质渔获物;需要与断章取义修复相结合,不要忘了关闭所有的阅读器、流和其他东西:)不,如果你需要关闭它们,你就做错了<代码>使用(…)
是的,我在C#中使用,不知道在VB中也是一样的,我的意思是,不要让它们超出范围,这很懒惰,而且不总是正确清理。是的,这一次它可以工作。现在我在加载XSLT编译时遇到XSLT编译错误异常xsltTransCompiled.Load(xr)
。但这是字符串本身的一个错误。问题是,我再次尝试将xml属性更改为前面带有转义字符的双引号,并尝试将所有单引号更改为带有转义字符的双引号。没有变化。。。我想我必须找出如何将.xsl
文档的内容表示为字符串。
"<xsl:template match='Area[generate-id() = generate-id(key(\"AreaByPosition\", Position)[1])]'>"
Dim xsltTransformerCode As New xsltTransformCode()
Dim sr as new System.IO.StringReader(xsltTransformerCode.transformationXSLTcode())
Dim xr as XmlReader = XmlReader.Create(sr)
Dim xsltTransCompiled As New XslCompiledTransform()
xsltTransCompiled.Load(xr)