Python,libxslt和在默认命名空间中查找对象

时间:2012-11-27 22:37:54

标签: python xml xslt xml-namespaces libxslt

我一直在寻找使用python libxml2库和XSLT进行XSTL处理的任何示例。我有一组带有默认命名空间的遗留文档,我一直在尝试将它们转换为可以导入到tinkerpop兼容数据库的东西。遗留数据有一个默认的命名空间,我无法弄清楚如何说服libxslt在数据中找到任何东西。

从我的示例中可以看出,我似乎无法从内部模板中获取任何内容。它似乎找到了最顶层的(cmap)模板,因为它吐出了<graphml>样板。我对XSLT来说相当新,所以这可能只是一个缺点,但是没有人在SO或google上似乎有任何这方面的例子。

我已经考虑过使用正则表达式删除违规的默认命名空间,但使用regexp解析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>

蟒蛇实验只是:

 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)

2 个答案:

答案 0 :(得分:1)

您在xslt中有关于名称空间的正确技术,即您必须将uri映射到前缀,因为“默认名称空间”不适用于xpath或模板匹配表达式。问题在于您正在执行的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模板中,您需要将xmlns="http://graphml.graphdrawing.org/xmlns"添加到<node>元素,否则将在没有命名空间(xmlns="")中输出。

答案 1 :(得分:0)

  

我一直很难找到任何XSTL处理的例子

也许是因为你拼错了? (对不起,但我们都犯了愚蠢的错误,不应该排除它们......)

实际上(请原谅我试图对这个问题难以解决的原因进行一些反省),我怀疑因为有很多人在使用默认命名空间时遇到了麻烦,所以你在某种程度上注意到这个原因,并且未能追求其他可能性。

另外,你似乎怀疑问题在于libxslt。养成使用不同的XSLT处理器尝试代码的习惯可能会很好,这样您就可以放下心灵并消除处理器错误。

通常,当您确定路径表达式无法选择某些内容时,有几种诊断方法:(a)盯着表达式直到看到错误,(b)简化表达式,例如。通过删除过滤器,直到您确定哪个部分是错误的,或者(c)转向使用模式感知和XSLT 2.0。 (一般来说,遗憾的是,(c)对大多数人来说太费力了,而且(b)对于非常简单的表达没有用处,所以他们继续浪费时间做(a))。