使用Python编辑XSL文件

时间:2014-04-30 19:11:29

标签: python xml xslt

我有以下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" />

有一种简单的方法吗?

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')