[英]Is it possible/How to convert string XML to XML using XSLT 2.0?
我有一个未格式化的字符串XML,必须使用XSLT 2.0将其转换为XML
下面是示例未格式化的字符串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>
<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>
预期输出如下:
<?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>
在XSLT 3.0中,可以使用parse-xml()
。 XSLT 2.0中没有保证可移植的方式。 有些处理器可能提供类似于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="<" string="<"/>
<xsl:output-character character=">" string=">"/>
</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.