我有结构化的这样一个纯文本文件:
!ITEM_NAME
Item value
!ANOTHER_ITEM
Its value
...
是否有可能与XSLT得到类似的一个文件:
<?xml version="1.0" encoding="UTF-8" ?>
<document>
<ITEM_NAME>Item value</ITEM_NAME>
<ANOTHER_ITEM>Its value</ANOTHER_ITEM>
...
</document>
编辑
我很抱歉,我还没有明确规定之前。 我试图完成这一转变与Visual Studio 2005 XSLT引擎。 我曾经尝试都提供的解决方案,而且我相信是正确的。 但是,Visual Studio 2005中不知道未解析文本的功能。
如果您可以使用XSLT 2.0,你可以使用unparsed-text()
...
文本文件 (不要使用文本文件作为直接输入到XSLT)。
!ITEM_NAME
Item value
!ANOTHER_ITEM
Its value
!TEST_BANG
Here's a value with !bangs!!!
XSLT 2.0(应用此XSLT本身(使用样式表作为XML输入),你还必须将路径更改为文本文件,你可能需要更改编码了。)
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="text-encoding" as="xs:string" select="'iso-8859-1'"/>
<xsl:param name="text-uri" as="xs:string" select="'file:///C:/Users/dhaley/Desktop/test.txt'"/>
<xsl:template name="text2xml">
<xsl:variable name="text" select="unparsed-text($text-uri, $text-encoding)"/>
<xsl:analyze-string select="$text" regex="!(.*)\n(.*)">
<xsl:matching-substring>
<xsl:element name="{normalize-space(regex-group(1))}">
<xsl:value-of select="normalize-space(regex-group(2))"/>
</xsl:element>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:template>
<xsl:template match="/">
<document>
<xsl:choose>
<xsl:when test="unparsed-text-available($text-uri, $text-encoding)">
<xsl:call-template name="text2xml"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="error">
<xsl:text>Error reading "</xsl:text>
<xsl:value-of select="$text-uri"/>
<xsl:text>" (encoding "</xsl:text>
<xsl:value-of select="$text-encoding"/>
<xsl:text>").</xsl:text>
</xsl:variable>
<xsl:message><xsl:value-of select="$error"/></xsl:message>
<xsl:value-of select="$error"/>
</xsl:otherwise>
</xsl:choose>
</document>
</xsl:template>
</xsl:stylesheet>
XML输出
<document>
<ITEM_NAME>Item value</ITEM_NAME>
<ANOTHER_ITEM>Its value</ANOTHER_ITEM>
<TEST_BANG>Here's a value with !bangs!!!</TEST_BANG>
</document>
这XSLT 2.0转换 :
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vText" select=
"replace(unparsed-text('file:///c:/temp/delete/text.txt'),'\r','')"/>
<xsl:template match="/">
<document>
<xsl:analyze-string select="$vText" regex="(!(.+?)\n([^\n]+))+">
<xsl:matching-substring>
<xsl:element name="{regex-group(2)}">
<xsl:sequence select="regex-group(3)"/>
</xsl:element>
</xsl:matching-substring>
<xsl:non-matching-substring><xsl:sequence select="."/></xsl:non-matching-substring>
</xsl:analyze-string>
</document>
</xsl:template>
</xsl:stylesheet>
appliedon任何XML文档(未使用),并具有驻留在本地文件中提供的文本时, C:\temp\delete\Text.txt
:
!ITEM_NAME
Item value
!ANOTHER_ITEM
Its value
...
产生想要的,正确的结果:
<document>
<ITEM_NAME>Item value</ITEM_NAME>
<ANOTHER_ITEM>Its value</ANOTHER_ITEM>
...
</document>
为了测试更彻底,我们将文件放在这样的文字:
As is text
!ITEM_NAME
Item value
!ANOTHER_ITEM
Its value
As is text2
!TEST_BANG
Here's a value with !bangs!!!
!TEST2_BANG
!!!Here's a value with !more~ !bangs!!!
As is text3
改造再次产生想要的,正确的结果:
<document>As is text
<ITEM_NAME>Item value</ITEM_NAME>
<ANOTHER_ITEM>Its value</ANOTHER_ITEM>
As is text2
<TEST_BANG>Here's a value with !bangs!!!</TEST_BANG>
<TEST2_BANG> !!!Here's a value with !more~ !bangs!!!</TEST2_BANG>
As is text3
</document>