【问题标题】:How to wrap input xsml in c data using xslt如何使用 xslt 在 cdata 中包装输入 xml
【发布时间】:2018-08-21 11:39:13
【问题描述】:

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> 

【问题讨论】:

    标签: xslt ibm-datapower


    【解决方案1】:

    需要用这样的变量创建 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> 
    

    【讨论】:

      【解决方案2】:

      CDATA 部分实际上只是一种替代转义机制:在 XML 级别上,您想要的结果是带有文本内容的 &lt;Output/&gt; 元素,恰好是序列化的输出。 DataPower 包含一个可以执行此操作的&lt;dp:serialize/&gt; 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 元素。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-05
        • 1970-01-01
        • 2015-05-14
        • 1970-01-01
        • 1970-01-01
        • 2013-01-08
        • 2016-09-24
        相关资源
        最近更新 更多