我一直在寻找使用 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
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)