【发布时间】:2017-08-31 06:35:47
【问题描述】:
我很难在 xls 代码文件中找到特定标签并将其与他的孩子一起获取。
例如:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:crossFunction="http://bla.bla.bla/" xmlns:simple-date-format="xalan://java.text.SimpleDateFormat" xmlns:srv="bla.bla.bla1" xmlns:xdt="http://www.w3.org/2005/02/xpath-datatypes" xmlns:date="http://exslt.org/dates-and-times" xmlns:customCoreFunction="http://bla.bla.bla2" xmlns:xalan="http://xml.apache.org/xalan" xmlns:productCoreFunction="http://bla.bla.bla" xmlns:srvesb0="http://esb.original.com.br/HistoricoComentario" xmlns:exsl="http://exslt.org/common" version="1.0" exclude-result-prefixes="xbla.bla.bla">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
<xsl:variable name="uriTokenSeparator" select="';'"/>
<xsl:variable name="uriKeyValueSeparator" select="'='"/>
<xsl:template match="/">
<xsl:variable name="messageContext" select="."/>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soapenv:Header></soapenv:Header>
<soapenv:Body>
<xsl:element name="srvesb0:getHistory">
<xsl:if test="((/soap:Envelope/soap:Body/*/note[@name='note']/catchId) and ((/soap:Envelope/soap:Body/*/note[@name='note']/catchId!='') or (/soap:Envelope/soap:Body/*/note[@name='note']/catchId/@*)))">
<xsl:element name="srvesb0:idCapture">
<xsl:value-of select="/soap:Envelope/soap:Body/*/note[@name='note']/catchId"/>
</xsl:element>
</xsl:if>
</xsl:element>
</soapenv:Body>
</soapenv:Envelope>
</xsl:template>
</xsl:stylesheet>
我只需要获取'Body'标签内的代码:
<soapenv:Body>
<xsl:element name="srvesb0:getHistory">
<xsl:if test="((/soap:Envelope/soap:Body/*/note[@name='note']/catchId) and ((/soap:Envelope/soap:Body/*/note[@name='note']/catchId!='') or (/soap:Envelope/soap:Body/*/note[@name='note']/catchId/@*)))">
<xsl:element name="srvesb0:idCapture">
<xsl:value-of select="/soap:Envelope/soap:Body/*/note[@name='note']/catchId"/>
</xsl:element>
</xsl:if>
</xsl:element>
</soapenv:Body>
然后,逐个元素迭代并获取它的属性。
但我使用的任何搜索代码都有效 .xpath .iter .查找
如果我迭代 .getroot() 会出现结果:
import lxml.etree as XT
xslt = XT.parse('transformation.xsl')
rootxslt = xslt.getroot()
for child in rootxslt:
child.tag = child.tag.split('}', 1)[1] # strip all namespaces
print child.tag, child.attrib, child.text
for child2 in child:
child2.tag = child2.tag.split('}', 1)[1] # strip all namespaces
print child2.tag, child2.attrib, child2.text
for child3 in child2:
child3.tag = child3.tag.split('}', 1)[1] # strip all namespaces
print child3.tag, child3.text, child3.text
for child4 in child3:
child4.tag = child4.tag.split('}', 1)[1] # strip all namespaces
print child4.tag, child4.text, child4.text
for child5 in child4:
child5.tag = child5.tag.split('}', 1)[1] # strip all namespaces
print child5.tag, child5.text, child5.text
但如果尝试迭代特定标签,则会出现任何结果:
import lxml.etree as XT
xslt = XT.parse('transformation.xsl')
rootxslt = xslt.getroot()
for child in rootxslt.findall("Body"):
child.tag = child.tag.split('}', 1)[1] # strip all namespaces
print child.tag, child.attrib, child.text
for child2 in child:
child2.tag = child2.tag.split('}', 1)[1] # strip all namespaces
print child2.tag, child2.attrib, child2.text
for child3 in child2:
child3.tag = child3.tag.split('}', 1)[1] # strip all namespaces
print child3.tag, child3.text, child3.text
for child4 in child3:
child4.tag = child4.tag.split('}', 1)[1] # strip all namespaces
print child4.tag, child4.text, child4.text
for child5 in child4:
child5.tag = child5.tag.split('}', 1)[1] # strip all namespaces
print child5.tag, child5.text, child5.text
有人知道我如何从“Body”标签中获取树吗?
谢谢
【问题讨论】:
标签: python xml xslt xpath elementtree