在我的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"><![CDATA[</xsl:text>
<xsl:value-of select="$value" />
<xsl:text disable-output-escaping="no">]]></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的尖括号保持为>
等。当我将函数内的代码直接复制到循环中时,一切正常。将disable-output-escaping
设置为“否”不会执行任何操作。
因此问题被确定为我正在使用函数或副本,但我很困惑。有没有人有想法?
答案 0 :(得分:3)
如果您希望将Value
元素的内容序列化为CDATA部分,则应使用<xsl:output cdata-section-elements="Value"/>
。
答案 1 :(得分:1)
进行两项更改:
在您的函数中,将disable-output-escaping
设置为yes
:
<Value>
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:value-of select="$value" />
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</Value>
调用您的函数时,请使用xsl:sequence
而不是。{
xsl:copy-of
:
<xsl:sequence select="cst:createArtistEntity('artist', ., 'Artist_')" />
说明:在复制过程中,xsl:copy-of
重新转义<
和>
,而xsl:sequence
引用原始节点而不复制(或逃避)。