Можно ли получить все 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="/"
как посещение каждого узла в документе или только корневого узла?