1

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&#xa;Systems by&#xa;Elimination&#xa;[MAT.ALG.510]"/>
        <concept id="1JNW55K3S-27XNMQ0-5T80" label="Using&#xa;Inequalities&#xa;[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)
4

2 に答える 2

2

xslt の名前空間に関する適切な手法があります。つまり、「デフォルトの名前空間」は xpath またはテンプレート マッチ式には適用されないため、URI をプレフィックスにマップする必要があります。問題は、あなたのc:cmapテンプレートであなたがやっているということです

  <xsl:apply-templates select="c:concept"/>

しかし、cmap要素には という名前の直接の子はありませんconcept。試す

  <xsl:apply-templates select="c:map/c:concept-list/c:concept"/>

またはより一般的に(ただし、効率が低下する可能性があります)

  <xsl:apply-templates select=".//c:concept"/>

concept直接の子要素だけでなく、すべての子孫要素を検索します。

また、テンプレートでは、要素c:conceptに追加する必要があります。そうしないと、名前空間なしで出力されます ( with )。xmlns="http://graphml.graphdrawing.org/xmlns"<node>xmlns=""

于 2012-11-27T23:15:14.507 に答える
0

XSTL処理の例を見つけるのに苦労しました

もしかして、書き間違えたから?(申し訳ありませんが、私たちは皆、ばかげた間違いを犯し、それらを除外すべきではありません...)

実は (なぜこの問題を解決するのが難しいのか、内省しようとしてすみません)、デフォルトの名前空間に問題を抱えている人が非常に多いため、何らかの理由でこれに固執し、他の可能性を追求できなかったのではないかと思います。

また、問題が libxslt にあるという疑いを持っているようです。コードを別の XSLT プロセッサで試す習慣を身につけて、頭を休め、考えられる原因として考えられるプロセッサのバグを排除することをお勧めします。

一般に、パス式が何かの選択に失敗していることを特定した場合、診断にはいくつかのアプローチがあります。(a) 何が問題なのかがわかるまで式をじっと見つめます。どの部分が間違っているかを特定するまでフィルターを削除するか、(c) スキーマ認識と XSLT 2.0 の使用に移行します。(一般的に、悲しいことに、(c) はほとんどの人にとって労力がかかりすぎます。また、(b) は非常に単純な表現では役に立たないため、(a) に時間を浪費し続けます)。

于 2012-11-28T11:51:56.240 に答える