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: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])]'>"  

しかし、ビジュアルベーシックでのエスケープについてはよくわかりません

于 2013-05-24T12:32:39.473 に答える
0

次のような一重引用符の組み合わせを見てください。

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

xml 属性には二重引用符を使用し、リテラルには単一引用符を使用することをお勧めします。これは VB 文字列の一部であるため、エスケープするために二重引用符を二重にする必要があります。

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

(この1行だけでなく、複数の場所など)

于 2013-05-24T12:28:25.593 に答える