【问题标题】:Need XSLT to wrap XML in the CDATA tags without hampering Root node with namespace需要 XSLT 将 XML 包装在 CDATA 标记中,而不会妨碍具有命名空间的根节点
【发布时间】:2020-05-16 16:33:19
【问题描述】:

要求基本上是将整个XML内容包装成带有CDATA的XML标签,下面输入XML

<?xml version="1.0" encoding="UTF-8"?>
<ns1:outSystemWS xmlns:ns1="http://abcd.co.za">
    <ns1:in0>
        <PQR>
            <STU>
                <TEST1>123</TEST1>
                <TEST2>XYZ</TEST2>
            </STU>
            <req>
                <TEST3>DEF</TEST3>
                <TEST4>GHI</TEST4>
            </req>
        </PQR>
    </ns1:in0>
</ns1:outSystemWS>

预期输出:

<?xml version="1.0" encoding="UTF-8"?>
<ns1:outSystemWS xmlns:ns1="http://abcd.co.za">
    <ns1:in0><![CDATA[<PQR>
            <STU>
                <TEST1>123</TEST1>
                <TEST2>XYZ</TEST2>
            </STU>
            <req>
                <TEST3>DEF</TEST3>
                <TEST4>GHI</TEST4>
            </req>
        </PQR>]]>
    </ns1:in0>
</ns1:outSystemWS>

我在 XSLT 下尝试过,但没有运气!!请帮忙

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="ns:outSystemWS[*]" xmlns:ns="http://abcd.co.za">
        <xsl:copy>
            <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
            <xsl:copy-of select="." />
            <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

【问题讨论】:

  • 你忘了告诉我们它是如何失败的。 (“运气不好”作为诊断没有用)。

标签: xml xslt cdata


【解决方案1】:

XSLT 3 在 XPath 3 serialize 函数的帮助下可以做到这一点:

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

  <xsl:output cdata-section-elements="ns1:in0" xmlns:ns1="http://abcd.co.za"/>

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

  <xsl:template match="PQR">
      <xsl:value-of select="serialize(.)"/>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/gVhDDz9

在早期版本的 XSLT 中,您需要检查是否有特定于处理器的扩展功能或方式,或者您需要使用基于 XSLT 的序列化,例如 https://lenzconsulting.com/xml-to-string/

【讨论】:

    【解决方案2】:

    我同意 Martin Honnen 的观点,即最好的解决方案是正确序列化 CDATA 部分的内容,而不是诉诸将 CDATA 标记作为转义文本插入的技巧。

    不过,在紧要关头你可以这样做:

    XSLT 1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ns1="http://abcd.co.za">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <!-- identity transform -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="ns1:in0" >
        <xsl:copy>
            <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
            <xsl:apply-templates/>
            <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
        </xsl:copy>
    </xsl:template>
    
    </xsl:stylesheet>
    

    【讨论】:

      猜你喜欢
      • 2010-10-27
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-11
      • 2015-04-16
      • 2011-11-12
      • 2016-07-08
      相关资源
      最近更新 更多