将 xml 源中的实体输出到有效的 html

outputting entities in xml source to valid html

我正在尝试转换一些 xml 内容编码为 html 实体。我想将实体内容输出为有效 html.

xml是这样的..

<?xml version="1.0" encoding="UTF-8"?><memo Version="1.0">
<header>
<meta title="==PROGRAMMING=="/>
<meta favourite="false"/>
<meta uuid="85f94ab2-77a8-XXXXXXXXXXXXXXX"/>
<meta createdTime="1551038092051"/>
</header>
<contents>
<content>&lt;p value="memo2" &gt;=====&lt;/p&gt;&lt;p&gt;https://medium.freecodecamp.org/&lt;/p&gt;&lt;p&gt;=====&lt;/p&gt;
</content>
</contents>
</memo>

我也有一些 xslt..

xslt_src = '''
 <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

     <xsl:template match="/">
       <html>
         <head>
           <xsl:apply-templates select="memo/header/meta"/>
         </head>
         <body>
           <xsl:apply-templates select="memo/contents"/>
         </body>
       </html>
     </xsl:template>

     <xsl:template match="memo/header/meta">
         <xsl:apply-templates select="@title"/>
     </xsl:template>

     <xsl:template match="memo/contents">
       <div class='content'>
         <xsl:value-of select="content/text()"/>
       </div>
     </xsl:template>

     <xsl:template match="@title">
       <span id='title'>
         <xsl:value-of select="."/>
       </span>
     </xsl:template>

 </xsl:stylesheet>
'''

我在Python中用lxml处理它...

_________________________________________________________________python

from lxml import etree

xslt = etree.XML(xslt_src)
transform = etree.XSLT(xslt)

src = open('simple.xml').read()
xml = etree.XML(str.encode(src))
result = transform(xml)
root = result.getroot()

print('-----------------------out 1')
print(etree.tostring(root, pretty_print=True).decode('utf-8'))

print('-----------------------out 2')
content = root.xpath('/html/body/div/text()')
print(content[0])

============================================= =================

etree.tostring(root) 打印结构化文档,但将 html 实体保留为原始 xml.

中的编码

------------------------出 1

<html>
  <head>
    <span id="title">==PROGRAMMING==</span>
  </head>
  <body>
    <div class="content">&lt;p value="memo2" &gt;=====&lt;/p&gt;&lt;p&gt;https://medium.freecodecamp.org/&lt;/p&gt;&lt;p&gt;=====&lt;/p&gt;
</div>
  </body>
</html>

但是如果我打印 root.xpath('/html/body/div/text()')[0](具有 html 内容的节点),我得到了我想要的...

---------------------出 2

<p value="memo2" >=====</p><p>https://medium.freecodecamp.org/</p><p>=====</p>

============================================= ==========================

我的问题是:如何让 etree.tostring(root) 用有效的 html 替换 html 实体,就像我直接使用文本属性时打印的那样?

干杯!

比特率

而不是:

<xsl:value-of select="content/text()"/>

尝试:

<xsl:value-of select="content" disable-output-escaping="yes"/>