简体   繁体   English

是否可以/如何使用XSLT 2.0将字符串XML转换为XML?

[英]Is it possible/How to convert string XML to XML using XSLT 2.0?

I have a unformatted string XML, which has to be converted to XML using XSLT 2.0 我有一个未格式化的字符串XML,必须使用XSLT 2.0将其转换为XML

Below is the sample unformatted string XML.I tried few XSLT but didnt worked like adding the disable-output-escaping.The Tag opening symbol(<) is not getting displayed,instead of that still the "<" is displayed.So basically need to replace "<" to "<" 下面是示例未格式化的字符串XML。我尝试了很少的XSLT,但没有像添加disable-output-escaping那样工作。没有显示Tag开头符号(<),而是显示了<<。将“ <”替换为“ <”

<?xml version = "1.0" encoding = "UTF-8"?>
<ns0:Message xmlns:ns0 = "http://www.àbc.com/abc/Message_V2.xsd">
    <ns0:Payload>
        &lt;ns:EXPINV02-ZEXPINV2-4x xmlns:ae="http://www.àbc.com/abc/05" 
    xmlns:ns="http://www.àbc.com/abc/IDOCS" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:type="ns:EXP">            
   &lt;EDI__DC>&lt;TABNAM>EDI_DC40&lt;/TABNAM>&lt;MANDT>510&lt;/MANDT>
  &lt;DOCNUM>0000000058569441&lt;/DOCNUM>&lt;DOCREL>740&lt;/DOCREL>
  &lt;STATUS>30&lt;/STATUS>&lt;DIRECT>1&lt;/DIRECT>&lt;OUTMOD>
  2&lt;/OUTMOD>&lt;EXPRSS xsi:nil="true"/>&lt;TEST 
  xsi:nil="true"/>&lt;IDOCTYP>EXPINV02&lt;/IDOCTYP>
  &lt;CIMTYP>ZEXPINV2&lt;/CIMTYP>&lt;MESTYP>ZINVOICE0&lt;/MESTYP>
  &lt;MESCOD xsi:nil="true"/>&lt;MESFCT xsi:nil="true"/>
  &lt;STD xsi:nil="true"/>&lt;STDVRS 
  xsi:nil="true"/>&lt;STDMES>ZINVOI&lt;/STDMES>
  &lt;SNDPOR>SAPNEQ&lt;/SNDPOR>&lt;SNDPRT>LS&lt;/SNDPRT>&lt;SNDPFC 
  xsi:nil="true"/>&lt;SNDPRN>NEQ510&lt;/SNDPRN>&lt;SNDSAD 
  xsi:nil="true"/>&lt;SNDLAD 
  xsi:nil="true"/>&lt;RCVPOR>NXPINVOICE&lt;/RCVPOR>&lt;RCVPRT>
  LS&lt;/RCVPRT>&lt;RCVPFC 
  xsi:nil="true"/>&lt;RCVPRN>PSFFORMSCA&lt;/RCVPRN>&lt;RCVSAD 
  xsi:nil="true"/>&lt;RCVLAD 
  xsi:nil="true"/>&lt;CREDAT>20190715&lt;/CREDAT>&lt;CRETIM>
  152902&lt;/CRETIM>&lt;REFINT xsi:nil="true"/>&lt;REFGRP 
  xsi:nil="true"/>&lt;REFMES xsi:nil="true"/>&lt;ARCKEY 
  xsi:nil="true"/>&lt;SERIAL>20190528064107&lt;/SERIAL>&lt;/EDI__DC>
    </ns0:Payload>
</ns0:Message>

Expected Output is below: 预期输出如下:

 <?xml version = "1.0" encoding = "UTF-8"?>
 <ns0:Message xmlns:ns0 = "http://www.àbc.com/abc/Message_V2.xsd">
    <ns0:Payload>
        <ns:EXPINV02-ZEXPINV2-4x xmlns:ae="http://www.àbc.com/abc/05" 
   xmlns:ns="http://www.àbc.com/abc/IDOCS" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:type="ns:EXP">
            <EDI__DC><TABNAM>EDI_DC40</TABNAM><MANDT>510</MANDT> 
  <DOCNUM>0000000058569441</DOCNUM><DOCREL>740</DOCREL> 
  <STATUS>30</STATUS><DIRECT>1</DIRECT><OUTMOD>2</OUTMOD><EXPRSS 
  xsi:nil="true"/><TEST xsi:nil="true"/><IDOCTYP>EXPINV02</IDOCTYP> 
  <CIMTYP>ZEXPINV2</CIMTYP><MESTYP>ZINVOICE0</MESTYP><MESCOD 
  xsi:nil="true"/><MESFCT xsi:nil="true"/><STD xsi:nil="true"/><STDVRS 
  xsi:nil="true"/><STDMES>ZINVOI</STDMES><SNDPOR>SAPNEQ</SNDPOR> 
  <SNDPRT>LS</SNDPRT><SNDPFC xsi:nil="true"/><SNDPRN>NEQ510</SNDPRN> 
  <SNDSAD xsi:nil="true"/><SNDLAD xsi:nil="true"/> 
  <RCVPOR>NXPINVOICE</RCVPOR><RCVPRT>LS</RCVPRT><RCVPFC xsi:nil="true"/> 
  <RCVPRN>PSFFORMSCA</RCVPRN><RCVSAD xsi:nil="true"/><RCVLAD 
  xsi:nil="true"/><CREDAT>20190715</CREDAT><CRETIM>152902</CRETIM><REFINT 
   xsi:nil="true"/><REFGRP xsi:nil="true"/><REFMES xsi:nil="true"/> 
  <ARCKEY 
   xsi:nil="true"/><SERIAL>20190528064107</SERIAL></EDI__DC>
    </ns0:Payload>
  </ns0:Message>

In XSLT 3.0 you can use parse-xml() . 在XSLT 3.0中,可以使用parse-xml() There's no guaranteed-portable way of doing it in XSLT 2.0. XSLT 2.0中没有保证可移植的方式。 Some processors may offer an extension function similar to parse-xml() , some may allow you to implement your own extension functions, some may support the "data" URI scheme in the document() function. 有些处理器可能提供类似于parse-xml()的扩展功能,有些可能允许您实现自己的扩展功能,有些可能支持document()函数中的“数据” URI方案。

Check Following Code:-

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
    <xsl:output method="xml" indent="yes" use-character-maps="angle-brackets"/>
<xsl:character-map name="angle-brackets">
    <xsl:output-character character="&lt;" string="&lt;"/>
    <xsl:output-character character="&gt;" string="&gt;"/>
</xsl:character-map>
<xsl:strip-space elements="*"/>
<xsl:template match="Plugins">
    <xsl:copy>
        <xsl:apply-templates select="Configuration"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="Configuration">
    <xsl:variable name="input">
        <xsl:value-of select="."/>
    </xsl:variable>
    <xsl:apply-templates select="document(concat('data:text/xml,',$input))"/>
</xsl:template>
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM