gpt4 book ai didi

python - 如何在 Python 中使用 XSLT 2.0 拆分 XML 文件

转载 作者:行者123 更新时间:2023-12-01 02:26:35 24 4
gpt4 key购买 nike

我有一个 XML 文件,我想通过 xslt 2.0 文件对其进行处理,将其拆分为多个 XML。我该怎么做?我目前使用的是Python 2.7.6。我尝试使用以下代码:

import lxml.etree as ET

dom = ET.parse(xml_filename)
xslt = ET.parse(xsl_filename)
transform = ET.XSLT(xslt)
newdom = transform(dom)
print(ET.tostring(newdom, pretty_print=True))

但这返回 None。

示例 XML 文件

<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<name>dataset containing bounding box labels on images</name>
<comment>created by BBTag</comment>
<tags>
<tag name="Perimeter-SVT" color="#f9e99c"/>
<tag name="Perimeter-Vivon" color="#032585"/>
<tag name="ScoreBoard-Vivon" color="#bf5786"/>
<tag name="Perimeter-StarSports" color="#12dadd"/>
</tags>
<images>
<image file="/var/www/html/tamsports.com/resources/videos/STAR_SPORTS_2_20170812/STAR_SPORTS_2_20170812-0011.jpg">
<box top="505" left="327" width="56" height="29">
<label>ScoreBoard-Vivon</label>
</box>
<box top="218" left="387" width="67" height="24">
<label>Perimeter-SVT</label>
</box>
</image>
<image file="/var/www/html/tamsports.com/resources/videos/STAR_SPORTS_2_20170812/STAR_SPORTS_2_20170812-0005.jpg">
<box top="254" left="159" width="64" height="23">
<label>Perimeter-Vivon</label>
</box>
<box top="255" left="225" width="61" height="20">
<label>Perimeter-Vivon</label>
</box>
<box top="254" left="285" width="63" height="23">
<label>Perimeter-Vivon</label>
</box>
<box top="253" left="357" width="58" height="24">
<label>Perimeter-Vivon</label>
</box>
<box top="254" left="424" width="56" height="25">
<label>Perimeter-Vivon</label>
</box>
<box top="256" left="484" width="65" height="23">
<label>Perimeter-Vivon</label>
</box>
<box top="507" left="326" width="58" height="26">
<label>ScoreBoard-Vivon</label>
</box>
</image>
<image file="/var/www/html/tamsports.com/resources/videos/STAR_SPORTS_2_20170812/STAR_SPORTS_2_20170812-0009.jpg">
<box top="249" left="400" width="59" height="29">
<label>Perimeter-StarSports</label>
</box>
</image>
</images>
</dataset>

XSLT 2.0 文件

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="//dataset/tags">
<xsl:for-each select="./tag">
<xsl:variable name="tagName" select="@name" />

<xsl:result-document method="xml" href="{$tagName}.xml">
<dataset>
<xsl:copy-of select="/dataset/name"/>
<xsl:copy-of select="/dataset/comment"/>
<tags>
<xsl:copy-of select="/dataset/tags/tag[./@name = $tagName]"/>
</tags>
<images>
<xsl:for-each select="/dataset/images/image[./box/label/text() = $tagName]">
<image>
<xsl:copy-of select="./@file"/>
<xsl:copy-of select="./box[./label[./text() = $tagName]]"/>
</image>
</xsl:for-each>
</images>
</dataset>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

最佳答案

Python 使用支持 EXSLT exsl:document http://exslt.org/exsl/index.html 的 libxslt :

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:template match="dataset/tags">
<xsl:for-each select="tag">
<xsl:variable name="tagName" select="@name" />

<exsl:document method="xml" href="{$tagName}.xml">
<dataset>
<xsl:copy-of select="/dataset/name"/>
<xsl:copy-of select="/dataset/comment"/>
<tags>
<xsl:copy-of select="/dataset/tags/tag[@name = $tagName]"/>
</tags>
<images>
<xsl:for-each select="/dataset/images/image[box/label = $tagName]">
<image>
<xsl:copy-of select="@file"/>
<xsl:copy-of select="box[label = $tagName]"/>
</image>
</xsl:for-each>
</images>
</dataset>
</exsl:document>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

关于python - 如何在 Python 中使用 XSLT 2.0 拆分 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47329129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com