Python libxml2 ライブラリと XSLT を使用した XSTL 処理の例を見つけるのに苦労しました。デフォルトの名前空間を持つレガシー ドキュメントのセットがあり、tinkerpop 準拠のデータベースにインポートできるものに変換しようとしています。レガシー データにはデフォルトの名前空間があり、libxslt にデータ内の何かを見つけさせる方法がわかりません。
私の例からわかるように、内部テンプレートからレンダリングするものをまったく取得できないようです。<graphml>
定型文を吐き出すので、最上位の(cmap)テンプレートを見つけるようです。私はXSLTにかなり慣れていないので、これは単なる欠点かもしれませんが、SOやGoogleの誰もこれが機能する例を持っていないようです.
問題のあるデフォルトの名前空間を正規表現で切り取ることを考えましたが、XML を正規表現で解析するのは通常悪い計画であり、間違った考えのように思えます。
次の XML があります。
<?xml version="1.0" encoding="UTF-8"?>
<cmap xmlns="http://cmap.ihmc.us/xml/cmap/">
<map width="1940" height="3701">
<concept-list>
<concept id="1JNW5YSZP-14KK308-5VS2" label="Solving Linear
Systems by
Elimination
[MAT.ALG.510]"/>
<concept id="1JNW55K3S-27XNMQ0-5T80" label="Using
Inequalities
[MAT.ALG.423]"/>
</concept-list
</map>
</cmap>
他にもたくさんありますが、これはそのサンプルです。コマンドを使用してxpathRegisterNS()
、デフォルトの名前空間を登録し、マップ、コンセプトマップなどを見つけることができました。これを libxslt で処理しようとしても、同じような運はありませんでした。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:c="http://cmap.ihmc.us/xml/cmap/">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="c:cmap">
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
<xsl:apply-templates select="c:concept"/>
</graphml>
</xsl:template>
<xsl:template match="c:concept">
<node> Found a node </node>
</xsl:template>
</xsl:stylesheet>
そして、Pythonの実験は次のとおりです。
import libxml2
import libxslt
styledoc = libxml2.parseFile("cxltographml.xsl")
style = libxslt.parseStylesheetDoc(styledoc)
doc = libxml2.parseFile("algebra.cxl")
result = style.applyStylesheet(doc, None)
print style.saveResultToString(result)