Можно ли получить все xPaths файла XSLT?

Можно ли получить все xPath, используемые в файле XSLT?

Например:

Файл 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 ответа

Вы можете использовать это:

 <?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>

Это сложно, потому что сопоставление правил шаблонов в XSLT очень динамично: если у вас есть шаблон с match="towns", который вызывает xsl: apply-templates, и если у вас есть другой шаблон с match="city", то компилятор XSLT может ' Не знаю, что есть путь / города / город.

Внутренне Saxon имеет возможность создавать "карту пути", как вы описали, и он используется для реализации "проекции документа" в XQuery, но он очень мало используется в XSLT из-за динамической отправки правила шаблона.

Так что статический анализ для определения путей не поможет вам продвинуться далеко вперед. Вы также предлагаете, что динамический анализ - захват путей, посещенных во время выполнения - также может представлять интерес. В принципе вы можете сделать это в Saxon с TraceListener. Сложность в том, чтобы точно определить, что вы подразумеваете под "посещенным" - например, считаете ли вы xsl:copy-of select="/" как посещение каждого узла в документе или только корневого узла?

Другие вопросы по тегам