XSLT解析存储在属性中的HTML转义,并将该属性的内容转换为元素的内容

时间:2010-02-22 11:46:04

标签: html parsing xslt

我坚持认为应该是简单的事情。我一直在寻找,但没有找到解决方案。希望你能帮助我。

我所拥有的是一个XML元素,其属性包含转义的HTML元素:

<Booking>    
  <BookingComments Type="RAM" comment="RAM name fred&lt;br/&gt;Tel 09876554&lt;br/&gt;Email fred@bla.com" />
</Booking>

我需要得到的是将@comment属性中的HTML元素和内容解析为

元素的内容,如下所示:

<p>
  RAM name fred<br/>Tel 09876554<br/>Email fred@bla.com
<p>

这是我的XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="xs fn" version="1.0">


<xsl:output method="html" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" 
    doctype-system="http://www.w3.org/TR/html4/loose.dtd" encoding="UTF-8" indent="yes" />

 <xsl:template name="some-template">
   <p>Some text</p>
   <p>
      <xsl:copy-of
        select="/Booking/BookingComments[lower-case(@Type)='ram'][1]/@comment"/>
   </p>     
 </xsl:template>
</xsl:stylesheet>

我读过这个副本是将转义的HTML元素恢复到正确元素的好方法。在这种特定情况下,因为它最初是一个属性,副本也会将其转换为属性。所以我得到了:

<p comment="RAM name fred<br/&gt;Tel 09876554<br/&gt;Email fred@bla.com"></p>

这不是我想要的。

如果我使用apply-templates而不是copy-of,如:

<p>
  <xsl:apply-templates select="/Booking/BookingComments[lower-case(@Type)='ram'[1]/@comment"/>
</p>

我将p的内容简单地视为文本,而不是恢复的HTML元素。

<p>RAM name fred&lt;br/&gt;Tel 09876554&lt;br/&gt;Email fred@bla.com</p>

我确定我错过了某些东西。我真的很感激任何帮助和提示!

2 个答案:

答案 0 :(得分:4)

我建议使用专用模板:

<!-- check if lower-casing @Type is really necessary -->
<xsl:template name="BookingComments[lower-case(@Type)='ram']/@comment">
  <p>
    <xsl:value-of select="." disable-output-escaping="yes" />
  </p>     
</xsl:template>

这样您只需将模板应用于属性即可。请注意,禁用输出转义可能会生成格式错误的输出。

答案 1 :(得分:0)

您可以绑定扩展函数parse(),它将字符串解析为节点集。确切的机制将取决于您的XSLT引擎。

在Xalan中,我们可以采用以下静态方法:

public class MyExtension
{
    public static NodeIterator Parse( string xml );
}

并像这样使用它:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:java="http://xml.apache.org/xalan/java"
    exclude-result-prefixes="java"
    version="1.0">

    <xsl:template match="BookingComments">
        <xsl:copy-of select="java:package.name.MyExtension.Parse(string(@comment))" />
    </xsl:template>

</xsl:stylesheet>