将 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><p value="memo2" >=====</p><p>https://medium.freecodecamp.org/</p><p>=====</p>
</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"><p value="memo2" >=====</p><p>https://medium.freecodecamp.org/</p><p>=====</p>
</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"/>
我正在尝试转换一些 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><p value="memo2" >=====</p><p>https://medium.freecodecamp.org/</p><p>=====</p>
</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"><p value="memo2" >=====</p><p>https://medium.freecodecamp.org/</p><p>=====</p>
</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"/>