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

How to output CDATA from within an xsl:function call?

在我的 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 设置为 'no' 不会执行任何操作。

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

进行两项更改:

  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引用了没有复制(或转义)的原始节点。

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