是否可以获取XSLT文件的所有xPath?

时间:2017-08-24 14:42:57

标签: xslt xpath jscript post-processing post-processor

是否可以获取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匹配/未匹配时输出一行? 欢迎提出想法,因为我很无望:) 谢谢!

2 个答案:

答案 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="/"是访问文档中的每个节点,还是只访问根节点?