我得到以下格式的 XML:
<result>
<client id="IP2633100">
<quoteback name="CASE_ID">XXX1501076</quoteback>
</client>
<order_dataset>
<subjects>
<subject id="S1">
<name type="primary">
<first>TEST</first>
<middle></middle>
<last>TESTING</last>
<suffix></suffix>
</name>
<birthdate>12/12/1948</birthdate>
<address type="mailing" ref="A2"/>
<address type="risk" ref="A1"/>
</subject>
</subjects>
<addresses>
<address id="A1">
<street1>TEST</street1>
<apartment></apartment>
<city>LAKE WORTH</city>
<state>FL</state>
<postalcode>33467</postalcode>
</address>
<address id="A2">
<street1>TEST</street1>
<apartment></apartment>
<city>LAKE WORTH</city>
<state>FL</state>
<postalcode>33467</postalcode>
</address>
</addresses>
</order_dataset>
<product_results>
<personal_property subject="TEST TESTING">
<report format="CP XML"><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<personal_property xmlns="http://cp.com/rules/client">
<admin>
<quoteback name="CASE_ID">XXX1501076</quoteback>
</admin>
<report>
<summary>
<total>0</total>
<subject>0</subject>
</summary>
<search_dataset>
<subject id="S1" unit_number="1" classification="Report">
<name>
<first>TEST</first>
<last>TESTING</last>
</name>
<birthdate>12/12/1948</birthdate>
</subject>
<address type="risk" id="A1">
<house>00</house>
<street1>TEST</street1>
<city>LAKE WORTH</city>
<state>FL</state>
<postalcode>33467</postalcode>
<zip4>3818</zip4>
</address>
</search_dataset>
</report>
</personal_property>
]]></report>
</personal_property>
</product_results>
</result>
我只能使用XSLT1.0 来转换这个数据。有没有办法将其转换为如下所示:
<
和< and >>
这是预期的输出:
<result>
<client id="IP2633100">
<quoteback name="CASE_ID">XXX1501076</quoteback>
</client>
<order_dataset>
<subjects>
<subject id="S1">
<name type="primary">
<first>TEST</first>
<middle></middle>
<last>TESTING</last>
<suffix></suffix>
</name>
<birthdate>12/12/1948</birthdate>
<address type="mailing" ref="A2"/>
<address type="risk" ref="A1"/>
</subject>
</subjects>
<addresses>
<address id="A1">
<street1>TEST</street1>
<apartment></apartment>
<city>LAKE WORTH</city>
<state>FL</state>
<postalcode>33467</postalcode>
</address>
<address id="A2">
<street1>TEST</street1>
<apartment></apartment>
<city>LAKE WORTH</city>
<state>FL</state>
<postalcode>33467</postalcode>
</address>
</addresses>
</order_dataset>
<product_results>
<personal_property subject="TEST TESTING">
<report format="CP XML">
<personal_property>
<admin>
<quoteback name="CASE_ID">XXX1501076</quoteback>
</admin>
<report>
<summary>
<total>0</total>
<subject>0</subject>
</summary>
<search_dataset>
<subject id="S1" unit_number="1" classification="Report">
<name>
<first>TEST</first>
<last>TESTING</last>
</name>
<birthdate>12/12/1948</birthdate>
</subject>
<address type="risk" id="A1">
<house>00</house>
<street1>TEST</street1>
<city>LAKE WORTH</city>
<state>FL</state>
<postalcode>33467</postalcode>
<zip4>3818</zip4>
</address>
</search_dataset>
</report>
</personal_property>
</report>
</personal_property>
</product_results>
</result>
我试过这个 XSL 转换:
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="result" name="firstPass">
<xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>
<xsl:variable name="firstPassOutput">
<xsl:call-template name="firstPass"/>
</xsl:variable>
<xsl:template name="extractCDATA">
<personal_property>
<xsl:value-of select="substring-before(substring-after(., '<personal_property xmlns="http://cp.com/rules/client">'),
'</personal_property>')"/>
</personal_property>
</xsl:template>
<xsl:variable name="cdataNodes">
<xsl:call-template name="extractCDATA"/>
</xsl:variable>
<xsl:template match="/">
<xsl:copy>
<xsl:value-of select="$firstPassOutput" disable-output-escaping="yes"/>
<xsl:value-of select="$cdataNodes" disable-output-escaping="yes"/>
</xsl:copy>
</xsl:template>
</xsl:transform>
它实现了第一部分,但我需要找到一种方法来摆脱下一行中的 CDATA 和 xml 版本和 xmlns,但保留节点。这是我的 XSL 转换输出:
<?xml version="1.0" encoding="UTF-8"?>
<client id="IP2633100">
<quoteback name="CASE_ID">XXX1501076</quoteback>
</client>
<order_dataset>
<subjects>
<subject id="S1">
<name type="primary">
<first>TEST</first>
<middle></middle>
<last>TESTING</last>
<suffix></suffix>
</name>
<birthdate>12/12/1948</birthdate>
<address type="mailing" ref="A2"/>
<address type="risk" ref="A1"/>
</subject>
</subjects>
<addresses>
<address id="A1">
<street1>TEST</street1>
<apartment></apartment>
<city>LAKE WORTH</city>
<state>FL</state>
<postalcode>33467</postalcode>
</address>
<address id="A2">
<street1>TEST</street1>
<apartment></apartment>
<city>LAKE WORTH</city>
<state>FL</state>
<postalcode>33467</postalcode>
</address>
</addresses>
</order_dataset>
<product_results>
<personal_property subject="TEST TESTING">
<report format="CP XML"><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<personal_property xmlns="http://cp.com/rules/client">
<admin>
<quoteback name="CASE_ID">XXX1501076</quoteback>
</admin>
<report>
<summary>
<total>0</total>
<subject>0</subject>
</summary>
<search_dataset>
<subject id="S1" unit_number="1" classification="Report">
<name>
<first>TEST</first>
<last>TESTING</last>
</name>
<birthdate>12/12/1948</birthdate>
</subject>
<address type="risk" id="A1">
<house>00</house>
<street1>TEST</street1>
<city>LAKE WORTH</city>
<state>FL</state>
<postalcode>33467</postalcode>
<zip4>3818</zip4>
</address>
</search_dataset>
</report>
</personal_property>
]]></report>
</personal_property>
</product_results>
<admin>
<quoteback name="CASE_ID">XXX1501076</quoteback>
</admin>
<report>
<summary>
<total>0</total>
<subject>0</subject>
</summary>
<search_dataset>
<subject id="S1" unit_number="1" classification="Report">
<name>
<first>TEST</first>
<last>TESTING</last>
</name>
<birthdate>12/12/1948</birthdate>
</subject>
<address type="risk" id="A1">
<house>00</house>
<street1>TEST</street1>
<city>LAKE WORTH</city>
<state>FL</state>
<postalcode>33467</postalcode>
<zip4>3818</zip4>
</address>
</search_dataset>
</report>
您需要分步执行此操作(每一步都将结果保存到一个文件中,该文件将由下一步处理):
第一步
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/result">
<xsl:copy>
<xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
结果一
<?xml version="1.0" encoding="UTF-8"?>
<result>
<client id="IP2633100">
<quoteback name="CASE_ID">XXX1501076</quoteback>
</client>
<order_dataset>
<subjects>
<subject id="S1">
<name type="primary">
<first>TEST</first>
<middle></middle>
<last>TESTING</last>
<suffix></suffix>
</name>
<birthdate>12/12/1948</birthdate>
<address type="mailing" ref="A2"/>
<address type="risk" ref="A1"/>
</subject>
</subjects>
<addresses>
<address id="A1">
<street1>TEST</street1>
<apartment></apartment>
<city>LAKE WORTH</city>
<state>FL</state>
<postalcode>33467</postalcode>
</address>
<address id="A2">
<street1>TEST</street1>
<apartment></apartment>
<city>LAKE WORTH</city>
<state>FL</state>
<postalcode>33467</postalcode>
</address>
</addresses>
</order_dataset>
<product_results>
<personal_property subject="TEST TESTING">
<report format="CP XML"><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<personal_property xmlns="http://cp.com/rules/client">
<admin>
<quoteback name="CASE_ID">XXX1501076</quoteback>
</admin>
<report>
<summary>
<total>0</total>
<subject>0</subject>
</summary>
<search_dataset>
<subject id="S1" unit_number="1" classification="Report">
<name>
<first>TEST</first>
<last>TESTING</last>
</name>
<birthdate>12/12/1948</birthdate>
</subject>
<address type="risk" id="A1">
<house>00</house>
<street1>TEST</street1>
<city>LAKE WORTH</city>
<state>FL</state>
<postalcode>33467</postalcode>
<zip4>3818</zip4>
</address>
</search_dataset>
</report>
</personal_property>
]]></report>
</personal_property>
</product_results>
</result>
第2步(输入为结果1)
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="report">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:value-of select="substring-after(. , '>')" disable-output-escaping="yes"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
结果2
<?xml version="1.0" encoding="UTF-8"?>
<result>
<client id="IP2633100">
<quoteback name="CASE_ID">XXX1501076</quoteback>
</client>
<order_dataset>
<subjects>
<subject id="S1">
<name type="primary">
<first>TEST</first>
<middle/>
<last>TESTING</last>
<suffix/>
</name>
<birthdate>12/12/1948</birthdate>
<address type="mailing" ref="A2"/>
<address type="risk" ref="A1"/>
</subject>
</subjects>
<addresses>
<address id="A1">
<street1>TEST</street1>
<apartment/>
<city>LAKE WORTH</city>
<state>FL</state>
<postalcode>33467</postalcode>
</address>
<address id="A2">
<street1>TEST</street1>
<apartment/>
<city>LAKE WORTH</city>
<state>FL</state>
<postalcode>33467</postalcode>
</address>
</addresses>
</order_dataset>
<product_results>
<personal_property subject="TEST TESTING">
<report format="CP XML">
<personal_property xmlns="http://cp.com/rules/client">
<admin>
<quoteback name="CASE_ID">XXX1501076</quoteback>
</admin>
<report>
<summary>
<total>0</total>
<subject>0</subject>
</summary>
<search_dataset>
<subject id="S1" unit_number="1" classification="Report">
<name>
<first>TEST</first>
<last>TESTING</last>
</name>
<birthdate>12/12/1948</birthdate>
</subject>
<address type="risk" id="A1">
<house>00</house>
<street1>TEST</street1>
<city>LAKE WORTH</city>
<state>FL</state>
<postalcode>33467</postalcode>
<zip4>3818</zip4>
</address>
</search_dataset>
</report>
</personal_property>
</report>
</personal_property>
</product_results>
</result>
第三步(输入为结果2)
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="http://cp.com/rules/client">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ns0:*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
结果 3
<?xml version="1.0" encoding="UTF-8"?>
<result>
<client id="IP2633100">
<quoteback name="CASE_ID">XXX1501076</quoteback>
</client>
<order_dataset>
<subjects>
<subject id="S1">
<name type="primary">
<first>TEST</first>
<middle/>
<last>TESTING</last>
<suffix/>
</name>
<birthdate>12/12/1948</birthdate>
<address type="mailing" ref="A2"/>
<address type="risk" ref="A1"/>
</subject>
</subjects>
<addresses>
<address id="A1">
<street1>TEST</street1>
<apartment/>
<city>LAKE WORTH</city>
<state>FL</state>
<postalcode>33467</postalcode>
</address>
<address id="A2">
<street1>TEST</street1>
<apartment/>
<city>LAKE WORTH</city>
<state>FL</state>
<postalcode>33467</postalcode>
</address>
</addresses>
</order_dataset>
<product_results>
<personal_property subject="TEST TESTING">
<report format="CP XML">
<personal_property>
<admin>
<quoteback name="CASE_ID">XXX1501076</quoteback>
</admin>
<report>
<summary>
<total>0</total>
<subject>0</subject>
</summary>
<search_dataset>
<subject id="S1" unit_number="1" classification="Report">
<name>
<first>TEST</first>
<last>TESTING</last>
</name>
<birthdate>12/12/1948</birthdate>
</subject>
<address type="risk" id="A1">
<house>00</house>
<street1>TEST</street1>
<city>LAKE WORTH</city>
<state>FL</state>
<postalcode>33467</postalcode>
<zip4>3818</zip4>
</address>
</search_dataset>
</report>
</personal_property>
</report>
</personal_property>
</product_results>
</result>
请注意,这需要支持
disable-output-escaping
的处理器。