我想使用hxt-xslt
基于包含 xslt 的第二个字符串将包含源 xml 的字符串转换为结果 xml 字符串。所以基本上,我想要一个类型的函数:
transf :: String -> String -> String
transf xmlStr xsltStr = ...
我四处搜索,文档中没有 xslt 的示例hxt
,而我能找到的最接近的是来自这个 SO answer的代码。
我的问题是示例和库IO
大量使用arrows
。我想调整代码并“剥离” IO
andarrow
以获得一个返回 a String
or的普通变换函数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 字符串来自w3schools 教程。
到目前为止,代码是没有 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 标头,例如<?xml version='1.0' encoding='UTF-8'?>
. 如果包含在 XML 或 XSLT 中,则返回错误。这是预期的还是我用错了?使用SO answer 中的IO/Arrows 代码时,正确的输出应该是如下的 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 转换?
谢谢。