如何从 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"><![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
设置为 'no' 不会执行任何操作。
所以问题被确定为我正在使用函数或副本,但我很困惑。有人有想法吗?
进行两项更改:
在您的函数中,将 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
引用了没有复制(或转义)的原始节点。
如果您希望将 Value
元素的内容序列化为 CDATA 部分,那么您应该使用 <xsl:output cdata-section-elements="Value"/>
.
在我的 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
设置为 'no' 不会执行任何操作。
所以问题被确定为我正在使用函数或副本,但我很困惑。有人有想法吗?
进行两项更改:
在您的函数中,将
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
引用了没有复制(或转义)的原始节点。
如果您希望将 Value
元素的内容序列化为 CDATA 部分,那么您应该使用 <xsl:output cdata-section-elements="Value"/>
.