我想使用hxt-xslt
将包含源xml的字符串基于包含xslt的第二个字符串转换为结果xml字符串。所以基本上,我想要一个类型的函数:
transf :: String -> String -> String
transf xmlStr xsltStr = ...
我四处搜索,hxt
文档中没有xslt的示例,我能找到的最接近的是来自this SO answer的代码。
我的问题是示例和库大量使用IO
和arrows
。我想调整代码和" strip" IO
和arrow
获取返回String
或Maybe String
的普通变换函数,但我对箭头知之甚少。
我问这个是因为我需要解析嵌入在CSV文件中的HTML。在IO
和Arrows
中生成结果会使XSLT代码很难与其余代码一起使用。
基于@ chi对问题原点版本的评论,我查看了文档,我能得到的最接近的代码是以下代码(通过猜测和强制执行4个函数中的3个)在Text.XML.HXT.XSLT.{Compilation,Application}
):
{-# LANGUAGE Arrows, PackageImports #-}
import "hxt" Text.XML.HXT.Core
import "hxt-xslt" Text.XML.HXT.XSLT.Application
import "hxt-xslt" Text.XML.HXT.XSLT.Compilation
import "hxt-xslt" Text.XML.HXT.XSLT.Common
--strXml = "<?xml version='1.0' encoding='UTF-8'?>\n"
strXml = "<catalog>\n <cd>\n <title>Empire Burlesque</title>\n <artist>Bob Dylan</artist>\n <country>USA</country>\n <company>Columbia</company>\n <price>10.90</price>\n <year>1985</year>\n </cd>\n</catalog> "
--strXslt = "<?xml version='1.0'?>\n\n"
strXslt = "<xsl:stylesheet version='1.0'\nxmlns:xsl='http://www.w3.org/1999/XSL/Transform'>\n\n<xsl:template match='/'>\n <html>\n <body>\n <h2>My CD Collection</h2>\n <table border='1'>\n <tr bgcolor='#9acd32'>\n <th>Title</th>\n <th>Artist</th>\n </tr>\n <xsl:for-each select='catalog/cd'>\n <tr>\n <td><xsl:value-of select='title'/></td>\n <td><xsl:value-of select='artist'/></td>\n </tr>\n </xsl:for-each>\n </table>\n </body>\n </html>\n</xsl:template>\n\n</xsl:stylesheet> "
applyStylesheetStr strXslt strXml =
let
xml = head $ runLA xread strXml
xslt = assembleStylesheet (prepareXSLTDocument $head $ runLA xread strXslt) []
in
showTrees $ applyStylesheet xslt xml
示例XML和XSLT字符串来自a w3schools tutorial。
到目前为止,代码没有IO和箭头。它输出:
*Main> applyStylesheetStr strXslt strXml
"\n \n Empire Burlesque\n Bob Dylan\n USA\n Columbia\n 10.90\n 1985\n \n"
我在这里有几个问题:
我注意到上面使用的xread
无法使用<?xml version='1.0' encoding='UTF-8'?>
之类的标准XML标头。如果包含在XML或XSLT中,则返回错误。这是预期的还是我使用它错了?
使用the SO answer中的IO /箭头代码时,正确的输出应该是HTML表格,如下所示:
<h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <tr> <td>Empire Burlesque</td> <td>Bob Dylan</td> </tr> </table>
如何修复代码以获得纯XSLT转换?
感谢。