XSLT1.0 使用 < > 和 CDATA

问题描述 投票:0回答:1

我得到以下格式的 XML:

<result>
    &lt;client id="IP2633100"&gt;
        &lt;quoteback name="CASE_ID"&gt;XXX1501076&lt;/quoteback&gt;
    &lt;/client&gt;
    &lt;order_dataset&gt;
        &lt;subjects&gt;
            &lt;subject id="S1"&gt;
                &lt;name type="primary"&gt;
                    &lt;first&gt;TEST&lt;/first&gt;
                    &lt;middle&gt;&lt;/middle&gt;
                    &lt;last&gt;TESTING&lt;/last&gt;
                    &lt;suffix&gt;&lt;/suffix&gt;
                &lt;/name&gt;
                &lt;birthdate&gt;12/12/1948&lt;/birthdate&gt;
                &lt;address type="mailing" ref="A2"/&gt;
                &lt;address type="risk" ref="A1"/&gt;
            &lt;/subject&gt;
        &lt;/subjects&gt;
        &lt;addresses&gt;
            &lt;address id="A1"&gt;
                &lt;street1&gt;TEST&lt;/street1&gt;
                &lt;apartment&gt;&lt;/apartment&gt;
                &lt;city&gt;LAKE WORTH&lt;/city&gt;
                &lt;state&gt;FL&lt;/state&gt;
                &lt;postalcode&gt;33467&lt;/postalcode&gt;
            &lt;/address&gt;
            &lt;address id="A2"&gt;
                &lt;street1&gt;TEST&lt;/street1&gt;
                &lt;apartment&gt;&lt;/apartment&gt;
                &lt;city&gt;LAKE WORTH&lt;/city&gt;
                &lt;state&gt;FL&lt;/state&gt;
                &lt;postalcode&gt;33467&lt;/postalcode&gt;
            &lt;/address&gt;
        &lt;/addresses&gt;
    &lt;/order_dataset&gt;
    &lt;product_results&gt;
        &lt;personal_property subject="TEST  TESTING"&gt;
            &lt;report format="CP XML"&gt;&lt;![CDATA[&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;
&lt;personal_property xmlns="http://cp.com/rules/client"&gt;
    &lt;admin&gt;
        &lt;quoteback name="CASE_ID"&gt;XXX1501076&lt;/quoteback&gt;
    &lt;/admin&gt;
    &lt;report&gt;
        &lt;summary&gt;
            &lt;total&gt;0&lt;/total&gt;
            &lt;subject&gt;0&lt;/subject&gt;
        &lt;/summary&gt;
        &lt;search_dataset&gt;
            &lt;subject id="S1" unit_number="1" classification="Report"&gt;
                &lt;name&gt;
                    &lt;first&gt;TEST&lt;/first&gt;
                    &lt;last&gt;TESTING&lt;/last&gt;
                &lt;/name&gt;
                &lt;birthdate&gt;12/12/1948&lt;/birthdate&gt;
            &lt;/subject&gt;
            &lt;address type="risk" id="A1"&gt;
                &lt;house&gt;00&lt;/house&gt;
                &lt;street1&gt;TEST&lt;/street1&gt;
                &lt;city&gt;LAKE WORTH&lt;/city&gt;
                &lt;state&gt;FL&lt;/state&gt;
                &lt;postalcode&gt;33467&lt;/postalcode&gt;
                &lt;zip4&gt;3818&lt;/zip4&gt;
            &lt;/address&gt;
        &lt;/search_dataset&gt;
    &lt;/report&gt;
&lt;/personal_property&gt;
]]&gt;&lt;/report&gt;
        &lt;/personal_property&gt;
    &lt;/product_results&gt;
</result>

我只能使用XSLT1.0 来转换这个数据。有没有办法将其转换为如下所示:

  1. 替换
    &lt;
    和< and >&gt;
  2. 删除 CDATA、xml version 和 xmlns 行,但保留其下方节点的值。

这是预期的输出:

<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(., '&lt;personal_property xmlns=&quot;http://cp.com/rules/client&quot;>'),
              '&lt;/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>
xml xslt xslt-1.0
1个回答
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"/>

<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
的处理器。

© www.soinside.com 2019 - 2024. All rights reserved.