我正在处理文本2 xml转换, 我需要将以下纯文本转换为xml
8
我当前的xsl如下:
A
我能够按等号分割数据, 我需要的是以下内容:
[header]
CODE VEND = ABCD
TYPE = ORDER
CL CDE = ABDEFGH
CL INV = ABDEFGH
DAT CDE = 03022020
EMAIL = abcd@ .fr
NO CDE = 0000042268
DAT LIV = 03022020
TYP CDE = CDE SPECIALE
NBLIN = 1
CONTRM = ABDEFGH
CL LIV = ABDEFGH
[LINE]
REF VEN = DEFGH
EAN = 123456789
QTE = 1
REF CUST = "AZERTYUOP "
[end]
+根据<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="txt-encoding" as="xs:string" select="'iso-8859-1'"/>
<xsl:param name="txt-uri" as="xs:string" select="'linktofile'"/>
<xsl:template match="/" name="text2xml">
<xsl:variable name="txt" select="unparsed-text($txt-uri, $txt-encoding)"/>
<xsl:variable name="entries" as="node()*">
<xsl:analyze-string select="$txt" regex="\r\n?|\n">
<xsl:non-matching-substring>
<xsl:analyze-string select="." regex="([^;]*).*=([^;]*)">
<xsl:matching-substring>
<entry>
<nom><xsl:value-of select="normalize-space(regex-group(1))"/>
</nom>
<valeur><xsl:value-of select="normalize-space(regex-group(2))"/>
</valeur>
<!--text2><xsl:value-of
select="normalize-space(regex-group(3))"/></text2-->
</entry>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:variable>
<results>
<xsl:for-each-group select="$entries" group-by="nom">
<xsl:copy-of
select="current-group()[1]/nom,current-group()/*[not(self::nom)]"/>
</xsl:for-each-group>
</results>
</xsl:template>
</xsl:stylesheet>
将报头(在[HEADER]和CL_LIV之间)分组
您能帮我吗
谢谢
更新的说明 来源
<CODE_VEND>ABCD</CODE_VEND>
<TYPE>ORDER</TYPE>
<CL_CDE>ABCD</CL_CDE>
目标
<NO_CDE>0000042268</NO_CDE>
...
答案 0 :(得分:0)
使用XSLT 3可以将其作为分组任务来完成,用group-starting-with
将文本文件中的行进行分组,然后使用analyze-string
将每一行分解为一个元素:
<xsl:stylesheet
version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
exclude-result-prefixes="#all">
<xsl:output indent="yes"/>
<xsl:mode on-no-match="shallow-skip"/>
<xsl:param name="txt-encoding" as="xs:string" select="'iso-8859-1'"/>
<xsl:param name="txt-uri" as="xs:string" select="'linktofile'"/>
<xsl:template match="/" name="text2xml">
<xsl:variable name="lines" as="xs:string*" select="unparsed-text-lines($txt-uri, $txt-encoding)"/>
<xsl:for-each-group select="$lines" group-starting-with=".[. = '[ENTETE]']">
<ORDER>
<xsl:for-each-group select="tail(current-group())" group-starting-with=".[. = '[LIGNE]']">
<xsl:choose>
<xsl:when test=". = '[LIGNE]'">
<LINE>
<xsl:apply-templates select="(current-group() => tail()) ! analyze-string(., '(.+) = (.+)')"/>
</LINE>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="(current-group() => tail()) ! analyze-string(., '(.+) = (.+)')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</ORDER>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="fn:match">
<xsl:element name="{replace(normalize-space(fn:group[@nr = 1]), ' ', '_')}">
<xsl:value-of select="normalize-space(fn:group[@nr = 2])"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
在线示例,其文本数据内联到https://xsltfiddle.liberty-development.net/bEzknsy。
XSLT 3适用于Saxon 9.8或更高版本或AltovaXML 2017 R3和更高版本。
如果只有XSLT 2,则当然可以使用第一步,您必须将文本行转换为XML元素,然后对这些元素使用类似的group-starting-with
。当然,您可以坚持使用analyze-string
来代替xsl:analyze-string
。