2009-09-18 106 views

回答

4

是的,您可以在XSLT中完成您想要的任务!

它可能会更容易在XSLT 2.0这样做,如果这是一个选择。 Michael Kay answered a similar question on the XSL mailing list in 2005.

复述他的答案,与小例子:

在XSLT 2.0,:您可以使用unparsed-text()函数读取文件,tokenize()将其分割成线(和忽略的第一行)。

<xsl:for-each select="tokenize(unparsed-text($in), '\r?\n')"> 
... 
</xsl:for-each> 

在XSLT 1.0:你可以假装它是一个XML 外部实体,并从引起 实体扩展XML文档引用它阅读纯文本文件。

<!DOCTYPE foo [ 
<!ENTITY bar SYSTEM "bar.txt"> 
]> 
<foo> 
&bar; 
</foo> 
+0

非常酷的技巧与实体参考!我希望它适合他。 :-) – 2009-09-21 18:03:03

0

做到这一点的方法是使用XSLT。

XSLT可以产生文本文件,但它不能进程文本文件。它只能处理格式良好的XML。

+0

做到这一点的方法是不使用XSLT。 - 同意但现在是唯一可行的选择。 – NitroxDM 2009-09-18 21:27:53

+0

@NitroxDM - 这就是每个答案在这里试图说 - *如果XSLT是只有**工具,你不能做*。您**必须包含一些其他工具才能实现您的目标,并且如果您可以涉及其他工具,那么您有一条途径可以使用比XSLT更合适的方法。 – 2009-09-18 22:33:46

+0

@Ben Blank - XSLT解决方案是完全可能的。看到我的答案。 – 2009-09-19 13:46:57

0

XSLT只会将有效的XML文件作为输入,而不是一般的文本文件。不过,它可以输出文字。

(我用XSLT生成C代码,例如。)

+0

XSLT 2.0可以使用unparsed-text()函数处理非XML文件,并且可以通过将XSLT 1.0用作实体引用来欺骗纯文本。 – 2009-09-19 13:49:34

0

如果您的XSLT处理器支持(通过的FFD二进制的XForms - 平面文件描述符)的任意到任意改造,有这样做的可能性。您可以将文本包装到节点中,然后使用常规XSLT模板在该节点上进行操作,以输出第一次回车后的内容。

+0

是否可以使用XSLT将文本文件的内容包装到节点中? – NitroxDM 2009-09-18 21:24:49

+0

@NitroxDM - Catch-22。如果需要先处理文件,然后才能将它用于XSLT,则无法使用XSLT进行处理。 – 2009-09-18 22:35:52

+0

取决于您的处理器/平台 - WebSphere DataPower(SOA设备)支持 - https://www.ibm.com/developerworks/forums/thread.jspa?messageID=14107417 – Thiyagaraj 2009-09-19 06:03:51