Haskell:如何在不返回IO或箭头的情况下编写XSLT转换函数

时间:2014-11-13 07:11:30

标签: xml haskell xslt hxt

我想使用hxt-xslt将包含源xml的字符串基于包含xslt的第二个字符串转换为结果xml字符串。所以基本上,我想要一个类型的函数:

transf :: String -> String -> String
transf    xmlStr  xsltStr = ...

我四处搜索,hxt文档中没有xslt的示例,我能找到的最接近的是来自this SO answer的代码。

我的问题是示例和库大量使用IOarrows。我想调整代码和" strip" IOarrow获取返回StringMaybe String的普通变换函数,但我对箭头知之甚少。

我问这个是因为我需要解析嵌入在CSV文件中的HTML。在IOArrows中生成结果会使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"

我在这里有几个问题:

  1. 我注意到上面使用的xread无法使用<?xml version='1.0' encoding='UTF-8'?>之类的标准XML标头。如果包含在XML或XSLT中,则返回错误。这是预期的还是我使用它错了?

  2. 使用the SO answer中的IO /箭头代码时,正确的输出应该是HTML表格,如下所示:

  3.     <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转换?

    感谢。

0 个答案:

没有答案