我有以下XSL文件:http://pastebin.com/H8CYPGUF
我想编辑以下部分:
<xsl:template name="testOptions">
<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
<tr valign="top">
<th align="left">userType</th>
<th align="left">numberOfThreads</th>
</tr>
<tr>
<td>customer</td>
<td>2</td>
</tr>
<tr>
<td>admin</td>
<td>5</td>
</tr>
</table>
<hr size="1" />
类似于:
<xsl:template name="testOptions">
<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
<tr valign="top">
<th align="left">userType</th>
<th align="left">numberOfThreads</th>
</tr>
<tr>
<td>customer</td>
<td>HERE GOES THE NEW VALUE</td>
</tr>
<tr>
<td>admin</td>
<td>HERE GOES THE NEW VALUE</td>
</tr>
</table>
<hr size="1" />
有一种简单的方法吗?
答案 0 :(得分:1)
我使用lxml来解析和遍历文档树。 lxml将节点子节点视为列表,这使得对兄弟节点的条件更新非常简单。此外,lxml默认输出xsl名称空间。
import io
from lxml import etree
doc = etree.parse(io.FileIO('input.xsl'))
for tr in doc.findall(".//tr"):
if tr[0].tag == 'td':
if tr[0].text == 'customer' :
if tr[1].tag == 'td' :
tr[1].text = 'new value 1'
elif tr[0].text == 'admin' :
if tr[1].tag == 'td' :
tr[1].text = 'new value 2'
print (etree.tostring(doc, pretty_print = True))
实际上,您甚至可以使用函数来概括这一点,以替换其前一个兄弟匹配值的任何节点的文本值:
def mod(match,value) :
for n in doc.xpath(".//*[preceding-sibling::*/text()='%s']" % match):
n.text = value
mod('customer', 'new customer value')
mod('admin', 'new admin value')