如何从xsl:function调用中输出CDATA?

时间:2015-01-29 14:34:07

标签: xml xslt cdata

在我的XSLT中,我试图在foreach中创建元素并在函数的帮助下。

        <xsl:variable name="artistList" as="xs:string*"><xsl:apply-templates select="@artist"/></xsl:variable>
        <xsl:for-each select="$artistList">
            <xsl:comment select="."></xsl:comment>
            <xsl:copy-of select="cst:createArtistEntity('artist', ., 'Artist_')" />
        </xsl:for-each>

功能本身如下;

<xsl:function name="cst:createArtistEntity">
    <xsl:param name="name" />
    <xsl:param name="value" />
    <xsl:param name="artistPrefix" />
    <ChunkEntity>
        <EntityType>Artist</EntityType>
        <EntityReference><xsl:value-of select="cst-ext:digest(concat($artistPrefix, $value))" /></EntityReference>
        <Column>
            <Name><xsl:value-of select="$name"/></Name>
            <Value>
                <xsl:text disable-output-escaping="no">&lt;![CDATA[</xsl:text>
                <xsl:value-of select="$value" />
                <xsl:text disable-output-escaping="no">]]&gt;</xsl:text>
            </Value>
        </Column>
    </ChunkEntity>
</xsl:function>

输出应该是:

   <ChunkEntity>
      <EntityType>Artist</EntityType>
      <EntityReference>b325f9fd1f0642c310c0168e061805f8</EntityReference>
      <Column>
         <Name>artist</Name>
         <Value><![CDATA[Jon Bon Jovi]]></Value>
      </Column>
   </ChunkEntity>

然而,在我的foreach中并且使用函数调用时,CDATA的尖括号保持为&gt;等。当我将函数内的代码直接复制到循环中时,一切正常。将disable-output-escaping设置为“否”不会执行任何操作。

因此问题被确定为我正在使用函数或副本,但我很困惑。有没有人有想法?

2 个答案:

答案 0 :(得分:3)

如果您希望将Value元素的内容序列化为CDATA部分,则应使用<xsl:output cdata-section-elements="Value"/>

答案 1 :(得分:1)

进行两项更改:

  1. 在您的函数中,将disable-output-escaping设置为yes

    <Value>
        <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
        <xsl:value-of select="$value" />
        <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
    </Value>
    
  2. 调用您的函数时,请使用xsl:sequence而不是。{ xsl:copy-of

    <xsl:sequence select="cst:createArtistEntity('artist', ., 'Artist_')" />
    

    说明:在复制过程中,xsl:copy-of重新转义<>,而xsl:sequence引用原始节点而不复制(或逃避)。