我想转换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())
答案 0 :(得分: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#代码中匆匆转换而来的,我相信如果它不能正常工作,你可以修补它。
标记
答案 1 :(得分:0)
查看单引号的组合,例如:
<xsl:apply-templates select='key('AreaByPosition', Position)/*[not(self::Position)]'/>
我建议对xml属性使用双引号,对文字使用单引号;因为这是VB字符串的一部分,所以这将涉及将双引号加倍到 escape 它们,即
"<xsl:apply-templates select=""key('AreaByPosition', Position)/*[not(self::Position)]""/>" &
(多个地点等,而不仅仅是这一行)
答案 2 :(得分:0)
您拥有此match
属性
match='Area[generate-id() = generate-id(key('AreaByPosition', Position)[1])]'
在单引号字符串中包含单引号字符串。
不幸的是你不能这样做,你将不得不逃避内部引号。我害怕我不知道如何在VB中做到这一点。
答案 3 :(得分: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])]'>"
但我不确定是否在视觉基础上进行了调整