2017-11-16 4 views
1

xslt 2.0ファイルを使用して複数のxmlファイルに分割したいxmlファイルがあります。どうすればいいのですか?誰かが一歩一歩手伝ってくれますか?私は現在Python 2.7.6を使用しています。私は次のコードを使用しようとしました:初心者がPythonでXSLT 2.0を使用してxmlファイルを分割する方法

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

しかし、これはなしを返します。

例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> 

フロー上スタックを満たすために詳細を追加します。ありがとうございました。

+2

全くlxmlの/ libxsltはPythonモジュールが使用するにはXSLT 2サポートはありません。 XSLT 2の 'xsl:result-document'を使うには、Saxon 9、XmlPrime、AltovaのようなXSLT 2プロセッサが必要です。 –

答えて

1

PythonはEXSLT exsl:documenthttp://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> 
+0

多くのありがとう...これは動作します....実際に私はexsl:documentページを訪問しました....私は初心者ですので、それを頭や尾を作ることができませんでした。ありがとうございました。 – Apricot

+0

完成のために、この初心者の証拠を作るために、私は追加したいと思います。上記のコードを使用してxmlファイルを解析しました。入力xmlのサイズに応じて、xmlが作成されるまでに数秒かかることがあります。 – Apricot

関連する問題