如何使用xslt将输入的xsml包装在c数据中

时间:2018-08-21 11:39:14

标签: xslt ibm-datapower

xslt的输入将如下所示:

<cd>
	<title>Empire Burlesque</title>
	<artist>Bob Dylan</artist>
	<country>USA</country>
	<company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
</cd>

xsl的输出应如下所示:

<Output>
<![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
</cd>
]]>
</Output> 

我写了下面的代码,但是<和>在输出中没有替换为<>。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:variable name="output">
<output> 
<xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text> 
<xsl:text disable-output-escaping="yes"> &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; </xsl:text> 
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
<xsl:text disable-output-escaping="yes">]]&gt;</xsl:text> 
</output>
</xsl:variable>
<xsl:copy-of select="$output"/>
</xsl:template>
</xsl:stylesheet> 

2 个答案:

答案 0 :(得分:0)

需要从这样的变量中创建CDATA:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:template match="/">
        <xsl:variable name="output">
            <cd>
                <title>Empire Burlesque</title>
                <artist>Bob Dylan</artist>
                <country>USA</country>
                <company>Columbia</company>
                <price>10.90</price>
                <year>1985</year>
            </cd>
        </xsl:variable>

        <output>
            <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
            <xsl:text disable-output-escaping="yes">&#x0a;</xsl:text>
            <xsl:text disable-output-escaping="yes">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</xsl:text>
            <xsl:copy-of select="$output"/>
            <xsl:text disable-output-escaping="yes">&#x0a;]]&gt;</xsl:text> 
        </output>

    </xsl:template>

</xsl:stylesheet> 

答案 1 :(得分:0)

CDATA节实际上只是一种替代的转义机制:在XML级别,您想要的结果是<Output/>元素,其文本内容恰好是序列化的输出。 DataPower包含一个<dp:serialize/> extension,可以做到这一点。

我认为工作样式表应该看起来像

<?xml version="1.0"?>
<xsl:stylesheet
    version="1.0"
    extension-element-prefixes="dp"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:dp="http://www.datapower.com/extensions">
  <xsl:output method="xml" cdata-section-elements="Output"/>
  <xsl:template match="/">
    <Output>
      <dp:serialize select="."/>
    </Output>
  </xsl:template>
</xsl:stylesheet>

(这总是有点奇怪的构造,因为您可以将XML直接嵌入XML中;如果您控制应用程序和模式,则可以考虑尝试对其进行更改,因此您不需要XML来解析XML的文本内容。 XML元素。)