如何保留xml样式表?

2 投票
1 回答
2130 浏览
提问于 2025-04-28 07:20

我想保留xml-stylesheet,但它不工作。
我用Python来修改XML,以便自动部署Hadoop。

XML内容:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
    <property>
    <name>fs.default.name</name>
    <value>hdfs://c11:9000</value>
  </property>
</configuration>

代码:

from xml.etree.ElementTree import ElementTree as ET

def modify_core_site(namenode_hostname):
    tree = ET()
    tree.parse("pkg/core-site.xml")
    root = tree.getroot()
    for p in root.iter("property"):
        name = p.find("name").text
        if name == "fs.default.name":
            text = "hdfs://%s:9000" % namenode_hostname
            p.find("value").text = text
    tree.write("pkg/tmp.xml", encoding="utf-8", xml_declaration=True)

modify_core_site("c80")

结果:

<?xml version='1.0' encoding='utf-8'?>
<configuration>
    <property>
    <name>fs.default.name</name>
    <value>hdfs://c80:9000</value>
  </property>
</configuration>

xml-stylesheet消失了……
我该怎么做才能保留它呢?

暂无标签

1 个回答

1

一种解决方案是你可以使用 lxml。一旦你解析了 XML,就可以继续查找 xsl 节点。下面是一个简单的示例:

>>> import lxml.etree
>>> doc = lxml.etree.parse('C:/downloads/xmltest.xml')
>>> root = doc.getroot()
>>> xslnode=root.getprevious().getprevious()
>>> xslnode
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

确保你加入一些异常处理,并检查这个节点是否确实存在。你可以通过以下方式检查这个节点是否是 xslt 处理指令:

>>> isinstance(xslnode, lxml.etree._XSLTProcessingInstruction)
True

撰写回答