是否可以获取XSLT文件中使用的所有xPath?
例如:
XSLT文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="/catalog/cd">
<tr>
<td>
<xsl:value-of select="title"/>
</td>
<td>
<xsl:value-of select="artist"/>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
作为输出,我想要一个这样的列表:
/catalog/cd
/catalog/cd/title
/catalog/cd/artist
也许通过制作一个自定义后期处理器,每当xPaths匹配/未匹配时输出一行? 欢迎提出想法,因为我很无望:) 谢谢!
答案 0 :(得分:0)
您可以使用:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="*">
<xsl:for-each select="ancestor-or-self::*">
<xsl:text>/</xsl:text>
<xsl:value-of select="local-name(.)"/>
</xsl:for-each>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
这很困难,因为XSLT中的模板规则匹配非常动态:如果您的模板匹配=&#34;城市&#34;调用xsl:apply-templates,如果你有另一个模板匹配=&#34; city&#34;,那么XSLT编译器就不知道有路径/城市/城市。
萨克森内部有能力建立一条路线图&#34;而是你描述的,它用于实现&#34;文档投影&#34;在XQuery中,但由于动态模板规则发送,它在XSLT中的用处很少。
因此,确定路径的静态分析并不能让你走得更远。您还建议动态分析 - 捕获在运行时访问的路径 - 也可能是有意义的。原则上,您可以使用TraceListener在Saxon中执行此操作。困难在于确定你的意思是什么?访问过&#34; - 例如,您认为xsl:copy-of select="/"
是访问文档中的每个节点,还是只访问根节点?