xsl:将文本转换为xml

时间:2020-03-09 14:01:41

标签: xml xslt

我正在处理文本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>

...

1 个答案:

答案 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

相关问题