Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 以字符串形式检索XSLT代码-“;“路径中的非法字符”;_.net_Xml_Vb.net_Xslt_Xslt 1.0 - Fatal编程技术网

.net 以字符串形式检索XSLT代码-“;“路径中的非法字符”;

.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

我想转换一个XML文档。我的XSLT代码工作正常,并且转换正确(在XMLPad中测试),但现在我想在VB.NET程序中对其进行转换。 问题是我不想从
.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)