0

是否可以获得 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

也许通过制作一个自定义后处理器,每次 xPath 匹配/不匹配时输出一行?欢迎提出想法,因为我非常绝望:) 谢谢!

4

2 回答 2

0

这很困难,因为 XSLT 中的模板规则匹配是非常动态的:如果您有一个带有 match="cities" 的模板调用 xsl:apply-templates,并且如果您有另一个带有 match="city" 的模板,那么 XSLT 编译器可以不知道有一条路径/cities/city。

在内部,Saxon 具有构建“路径图”的能力,而不是您所描述的,它用于在 XQuery 中实现“文档投影”,但由于动态模板规则发送,它在 XSLT 中几乎没有用处。

因此,确定路径的静态分析不会让您走得太远。您还建议动态分析 - 捕获在运行时访问的路径 - 也可能是有意义的。原则上,您可以使用 TraceListener 在撒克逊语中做到这一点。困难在于确切地确定“已访问”的含义-例如,您是否认为xsl:copy-of select="/"访问文档中的每个节点,还是仅访问根节点?

于 2017-08-25T08:14:19.340 回答
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>
于 2017-08-24T15:05:39.487 回答