2015-01-29 6 views
1

В моем XSLT я пытаюсь создать элементы внутри foreach и с помощью функции.Как вывести CDATA из вызова функции xsl: function?

 <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> 

Однако внутри моей Еогеасп и с использованием вызова функции, угловые скобки в CDATA сохраняются в &gt; и т.д. Когда я копирую код внутри функция прямо в петлю, все работает. Установка disable-output-escaping в 'no' ничего не делает.

Таким образом, проблема заключается в том, что я использую функцию или копию, но я в замешательстве. У кого-нибудь есть идея?

ответ

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 ссылается на исходные узлы без копирования (или экранирования).

+0

DOE «нет» осталось от отладки. Но «последовательность» действительно работает. Спасибо огромное! Не могли бы вы объяснить, что здесь происходит? –

+0

DOE: понимается. Последовательность: хороший вопрос: он ссылается на оригинал, а не на копирование; ответ обновлен. – kjhughes

3

Если вы хотите, чтобы содержимое элемента Value сериализовать как раздел CDATA, то вы должны использовать <xsl:output cdata-section-elements="Value"/>.

+0

Ох .. это тоже очень хорошая идея. Я не знал, что это существовало! благодаря –

Смежные вопросы