2

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

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

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

我的问题是示例和库IO大量使用arrows。我想调整代码并“剥离” IOandarrow以获得一个返回 a Stringor的普通变换函数Maybe 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 字符串来自w3schools 教程

到目前为止,代码是没有 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 标头,例如<?xml version='1.0' encoding='UTF-8'?>. 如果包含在 XML 或 XSLT 中,则返回错误。这是预期的还是我用错了?

  2. 使用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 转换?

谢谢。

4

0 回答 0