替换<与<使用XSLT

时间:2017-06-08 17:56:12

标签: xslt

我有一个传入的XML,我有&lt;而不是<我们可以使用XSLT将所有传入的&lt;替换为<标记。有人可以让我知道我们怎样才能做到这一点。

输入:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <ns1:pr xmlns:ns1="http://example.com">
            <ns1:dis>
                &lt;TP memberID="121897679001" FirstName="Tom" LastName="regen" auId="42424234">
                    &lt;TPV>
                        &lt;KAN>
                            &lt;sur sType="POI" cDate="09022017" MDate="09022017" eDate="05182003">
                                &lt;question id="9" desc="afa">
                                    &lt;ans id="0" desc="des">09172017</ans>
                                &lt;/question>                              
                            &lt;/sur>
                        &lt;/KAN>
                    &lt;/TPV>
                &lt;/TP>
            </ns1:dis>
        </ns1:pr>
    </soapenv:Body>
</soapenv:Envelope>

预期产出:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <ns1:pr xmlns:ns1="http://example.com">
            <ns1:dis>
                <TP memberID="121897679001" FirstName="Tom" LastName="regen" auId="42424234">
                    <TPV>
                        <KAN>
                            <sur sType="POI" cDate="09022017" MDate="09022017" eDate="05182003">
                                <question id="9" desc="afa">
                                    <ans id="0" desc="des">09172017</ans>
                                </question>                             
                            </sur>
                        </KAN>
                    </TPV>
                </TP>
            </ns1:dis>
        </ns1:pr>
    </soapenv:Body>
</soapenv:Envelope>

2 个答案:

答案 0 :(得分:1)

您的xml无效,因为</ans>未使用<ans>启动,我认为您不能在其上应用XSLT

如果您的语言是Java,则可以使用replaceAll,如:

inputXml = inputXml.replaceAll( "&lt;", "<" );

答案 1 :(得分:1)

假设该ns1:dis元素的内容是正确转义的XML片段(您的代码段不是,因为</ans>需要&lt;/ans>),您现在可以使用{ {3}}和parse-xml-fragment函数(XSLT 3.0)如下:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    exclude-result-prefixes="xs math"
    version="3.0">

    <xsl:mode on-no-match="shallow-copy"/>

    <xsl:template match="dis" xpath-default-namespace="http://example.com">
        <xsl:copy>
            <xsl:copy-of select="parse-xml-fragment(.)"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

与Saxon 9.8(所有版本)或9.7(PE或EE)以及当前版本的Altova XMLSpy / Raptor一样,可以与任何其他XSLT 3.0实现一起使用。