VB.Net 将 XSL 转换应用于 XML 文件 [英] VB.Net apply XSL transformation to XML file
问题描述
我有一些由我的应用程序构建的 XML.这个 XML 被放到一个 XML 文件中,然后我希望应用一个 XSL 样式表,以便将它转换为一个 HTML 页面.然而,每次,它只是不断地输出原始 XML 而不是转换后的 HTML
I have got some XML which is built by my application. This XML is dropped to an XML file, which I then wish to apply an XSL stylesheet to in order to convert it to a HTML page. However, every time, it just keeps coming out with the original XML rather than the transformed 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 做过任何事情了,所以我确定我可能遗漏了一些明显的东西!
It is ages since I did anything with XSL and .NET so I'm sure I am probably missing something obvious!
更新:以下是根据以下建议进行的修改后的当前代码...代码隐藏:
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.
I am still only getting the original XML being output to my HTML file, rather than the HTML which should result from the XML/XSLT Transformation.
推荐答案
循环中的 XPath 错误:
You've the wrong XPath in your loop:
<xsl:for-each select="firelist/visitor">
<!-- ... --->
</xsl:for-each>
虽然为了提高可读性和更好地使用 XSLT 的功能,我建议使用专用模板而不是显式的 for-each 循环:
Though for increased readability and better use of XSLT's features I would recommend working with dedicated templates instead of explicit for-each loops:
<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>
这篇关于VB.Net 将 XSL 转换应用于 XML 文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!