1

我一直在寻找使用 python libxml2 库和 XSLT 处理 XSTL 的任何示例时遇到了麻烦。我有一组带有默认命名空间的遗留文档,我一直在尝试将它们转换为可以导入到符合 tinkerpop 的数据库中的内容。遗留数据有一个默认命名空间,我不知道如何说服 libxslt 在数据中找到任何东西。

正如您从我的示例中看到的那样,我似乎根本无法从内部模板中获取任何东西来渲染。它似乎确实找到了最顶层的 (cmap) 模板,因为它吐出了<graphml>样板文件。我对 XSLT 相当陌生,所以这可能只是一个缺点,但 SO 或谷歌上似乎没有人有任何这种工作的例子。

我曾考虑过使用正则表达式删除有问题的默认命名空间,但使用正则表达式解析 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 中命名空间的正确技术,即您必须将 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="")中输出。

于 2012-11-27T23:15:14.507 回答
0

我一直在寻找任何 XSTL 处理的例子

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

实际上(请原谅我试图反省一下为什么这个问题很难解决),我怀疑是因为很多人在使用默认命名空间时遇到了麻烦,所以您不知何故将其视为原因,而未能寻求其他可能性。

此外,您似乎怀疑问题出在 libxslt 上。养成使用不同 XSLT 处理器尝试代码的习惯可能会很好,这样您就可以放心并消除处理器错误作为可能的原因。

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

于 2012-11-28T11:51:56.240 回答