VB.Net应用XSL转换到XML文件(VB.Net apply XSL transformatio

2019-09-21 02:00发布

我有一些XML由我的应用程序构建。 这个XML是下降到一个XML文件,然后我想,以将其转换为HTML页面的XSL样式表申请。 然而,每一次,它只是不断走出原始XML,而不是转换后的HTML

下面是XML:

<firelist>
  <visitor>
    <Title>Mr</Title>
    <Forename>Gregory</Forename>
    <Surname>House</Surname>
    <Visiting>asasasas</Visiting>
    <VisitTime>11:41</VisitTime>
    <PurposeOfVisit>asasasasa</PurposeOfVisit>
    <BadgeID>a</BadgeID>
    <Campus>KWA</Campus>
    <VisitingFrom>Princeton-Plainsboro Teaching Hospital</VisitingFrom>
    <ImagePath>\\more\DataCard\VisitorPhotos\V0004.jpg</ImagePath>
  </visitor>
</firelist>

这里是样式表:

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>

    <xsl:template match="/">
        <html>
            <body>
                <xsl:for-each select="visitor">
                    <xsl:value-of select="title"/>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

这里是做转换的代码:

Dim document As XmlDocument     ''# Xml document root
Dim navigator As XPathNavigator ''# navigate document
Dim transformer As XslTransform ''# transform document
Dim output As StringWriter

document = New XmlDocument()
document.Load("firelist.xml")

''# create navigator
navigator = document.CreateNavigator

''# load style sheet
transformer = New XslTransform()
transformer.Load("firelist.xslt")

''# transform XML data
output = New StringWriter()
transformer.Transform(navigator, Nothing, output)

''# display transformation in text box
Console.WriteLine(output.ToString)
''# write transformation result to disk
Dim stream As FileStream = New FileStream("firelist.html", FileMode.Create)

Dim writer As StreamWriter = New StreamWriter(stream)
writer.Write(output.ToString)

''# close streams
writer.Close()
output.Close()

这是因为我做了什么与XSL年龄和.NET,所以我敢肯定,我可能失去了一些东西明显!

更新:这里是代码,因为它目前为为如下建议...代码隐藏结果作出以下修改:

Dim document As XmlDocument     ' Xml document root
Dim navigator As XPathNavigator ' navigate document
Dim transformer As XslCompiledTransform ' transform document
Dim output As StringWriter

document = New XmlDocument()
document.Load("firelist.xml")

' create navigator
navigator = document.CreateNavigator

' load style sheet
transformer = New XslCompiledTransform()
transformer.Load("firelist.xslt")

' transform XML data
output = New StringWriter()
transformer.Transform(navigator, Nothing, output)

' display transformation in text box
Console.WriteLine(output.ToString)
' write transformation result to disk
Dim stream As FileStream = _
   New FileStream("firelist.html", FileMode.Create)

Dim writer As StreamWriter = New StreamWriter(stream)
writer.Write(output.ToString)

' close streams
writer.Close()
output.Close()

XML:

<?xml version="1.0" encoding="utf-8"?>
<firelist>
  <visitor>
    <Title>Dr</Title>
    <Forename>James</Forename>
    <Surname>Wilson</Surname>
    <Visiting>bob</Visiting>
    <VisitTime>11:30</VisitTime>
    <PurposeOfVisit>dunno</PurposeOfVisit>
    <BadgeID>4</BadgeID>
    <Campus>KWA</Campus>
    <VisitingFrom>Princeton-Plainsboro Teaching Hospital</VisitingFrom>
    <ImagePath>\\more\DataCard\VisitorPhotos\V0005.jpg</ImagePath>
  </visitor>
</firelist>

XSLT:

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/firelist">
        <html>
            <body>
                <xsl:for-each select="visitor">
                    <xsl:value-of select="title"/>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

我仍然只得到原始的XML输出到我的HTML文件,而不是这将导致从XML / XSLT转换的HTML。

Answer 1:

您在你的循环错误的XPath:

<xsl:for-each select="firelist/visitor">
  <!-- ... --->
</xsl:for-each>

虽然增加可读性和更好地使用XSLT的功能,我会建议使用专用的模板,而不是工作的明确的for-each循环:

<xsl:template match="/">
  <html>
    <body>
      <xsl:apply-templates select="firelist/visitor" />
    </body>
  </html>
</xsl:template>

<xsl:template match="visitor">
  <xsl:value-of select="title"/>
</xsl:template>


Answer 2:

我不知道原来的问题是什么,但你绝对应该避免使用XslTransform完全(它不建议使用),并使用XslCompiledTransform代替。 这是如何做:

transformer = New XslCompiledTransform()
transformer.Load("firelist.xslt")

''# transform XML data
output = New StringWriter()
transformer.Transform(navigator, Nothing, output)

试试这个,看看你得到不同的行为。



Answer 3:

发现概率...非常基本的。 有之间的差异

<xsl:value-of select="title" />

<xsl:value-of select="Title" />

变压器时做transformer.Transform(navigator, Nothing, output)

是区分大小写的,当它使用XSLT文件。

XML标记是

<Title>Dr</Title>

在XSLT标签

<xsl:value-of select="title" />

我用调试器跟踪使变压器调试

// Enable XSLT debugging. 
XslCompiledTransform xslt = new XslCompiledTransform(true);

请享用 !!



Answer 4:

尝试改变XSLT这样:

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/firelist">
        <html>
            <body>
                <xsl:for-each select="visitor">
                    <xsl:value-of select="title"/>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>


文章来源: VB.Net apply XSL transformation to XML file