1

我想转换一个 XML 文档。我的 XSLT 代码正在工作,并且可以正确转换(在 XMLPad 中测试),但现在我想在我的 VB.NET 程序中对其进行转换。问题是我不想从.xsl文件中加载 XSLT 代码。我将它硬编码在一个函数中,但我遇到了Illegal characters in path异常。

有没有可能这样:

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

因为当我尝试加载它时出现异常

Dim xsltTransformerCode As New xsltTransformCode()
Dim xsltTransCompiled As New XslCompiledTransform()
xsltTransCompiled.Load(xsltTransformerCode.transformationXSLTcode())
4

4 回答 4

2

我刚刚查看了 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# 代码匆忙转换而来的,我相信如果它不能按原样工作,你可以修改它。

标记

于 2013-05-24T12:32:50.293 回答
0

查看单引号的组合,例如:

<xsl:apply-templates select='key('AreaByPosition', Position)/*[not(self::Position)]'/>

我建议对 xml 属性使用双引号,对文字使用单引号;因为这是 VB 字符串的一部分,所以这将涉及双引号以转义它们,即

"<xsl:apply-templates select=""key('AreaByPosition', Position)/*[not(self::Position)]""/>" &

(多个位置等,不仅仅是这一行)

于 2013-05-24T12:28:25.593 回答
0

你有这个match属性

match='Area[generate-id() = generate-id(key('AreaByPosition', Position)[1])]'

其中包含单引号字符串中的单引号字符串。

不幸的是,您不能这样做,您将不得不转义内部引号。恐怕我不知道如何在 VB 中做到这一点。

于 2013-05-24T12:29:49.707 回答
0

例如以下行是不正确的转义:

"<xsl:template match='Area[generate-id() = generate-id(key('AreaByPosition', Position)[1])]'>"  

从 xslt 的角度来看,您必须使用撇号和引号作为分隔符。如果属性分隔符是撇号,则必须使用引号作为 const 的分隔符(例如您的键名AreaByPosition.

<xsl:template match='Area[generate-id() = generate-id(key("AreaByPosition", Position[1])]'>" 

但这从视觉基本的角度来看是行不通的。您必须转义引号。因此尝试:

   "<xsl:template match='Area[generate-id() = generate-id(key(\"AreaByPosition\", Position)[1])]'>"  

但我不确定在 Visual Basic 中转义

于 2013-05-24T12:32:39.473 回答