在xml输出中添加特殊字符

时间:2013-03-04 15:13:56

标签: xslt

我们有一段代码,它以如下格式返回XML:

源XML:

<Root>
    <Book>
        <BookId>a</BookId>
        &lt;Description&gt;aDescription&lt;/Description&gt;
    </Book>
    <Book>
        <BookId>b</BookId>
        &lt;Description&gt;bDescription&lt;/Description&gt;
    </Book>
</Root>

我想用文字字符替换特殊字符......

&lt; 

将是&lt;等

我知道我可以使用:

<xsl:character-map name="escapeMapper">
    <xsl:output-character character="&lt;" string="&lt;"/>
    <xsl:output-character character="&gt;" string="&gt;"/>        
</xsl:character-map>  

然而,这是扭曲,我想首先转换特殊字符,然后通过其他模板运行生成的XML。所以,我想通过模板替换特殊字符来运行源XML,将结果放入变量:

<xsl:variable name="vrtfPass1">

现在我可以使用多次传递技术并使用变量作为源应用其他模板。

如何将特殊字符转换为文字字符?

1 个答案:

答案 0 :(得分:0)

听起来你想做的不是将&lt;&gt;转换为<>,而是将解析 XML ,是吗?你能在你正在做的事情中使用Saxon扩展功能吗?如果是这样,我认为你可以这样做:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:saxon="http://saxon.sf.net/">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <xsl:variable name="loaded">
      <xsl:apply-templates />
    </xsl:variable>

    <xsl:apply-templates select="$loaded/*" />
  </xsl:template>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Book/text()[normalize-space()]">
    <xsl:copy-of select="saxon:parse(.)"/>
  </xsl:template>
</xsl:stylesheet>

虽然这假设Book的文本孩子本身就是格式良好的XML。

相关问题