我一直在寻找使用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
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>
蟒蛇实验只是:
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)
答案 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))。