Итак, вы хотите проанализировать код XSLT и вывести таблицу с сопоставлением элементов? Это исключительно на основе кода XSLT или входной XML также должен быть обработан? Я полагаю, что с такой простой таблицей стилей довольно легко обрабатывать и считывать шаблоны match
и имя непосредственного дочернего элемента, если используются литеральные элементы результата, но, конечно, в целом, если существует более сложная структура таблицы стилей с вычисляемыми элементами,называемые шаблоны, создающие сопоставление, не будут такими простыми.
Для прямого сопоставления, как и для вашего образца, легко обработать XSLT с помощью XSLT для его анализа, например, следующий XSLT 3
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:param name="sep" as="xs:string">,</xsl:param>
<xsl:mode on-no-match="shallow-skip"/>
<xsl:output method="text" item-separator=" "/>
<xsl:template match="/">
<xsl:sequence select="'Input XML' || $sep || 'Result XML'"/>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="xsl:template[@match]">
<xsl:sequence
select="tokenize(@match, '\s*\|\s*') !
(. || $sep || node-name(current()/*[1]))"/>
</xsl:template>
</xsl:stylesheet>
при работе с Saxon 9.9 HE с вашим примером кода XSLT выводит
Input XML,Result XML
Section1,sect1
Section1Heading,title
Section2Heading,title
Section2,sect2
Para,para
С XSLT 2 вы можете код https://xsltfiddle.liberty -development.net / bFWR5DS , т. Е.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="2.0">
<xsl:param name="field-sep" as="xs:string">,</xsl:param>
<xsl:param name="line-sep" as="xs:string" select="' '"/>
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:value-of select="concat('Input XML', $field-sep, 'Result XML')"/>
<xsl:value-of select="$line-sep"/>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="xsl:template[@match]">
<xsl:value-of
select="for $pattern in tokenize(@match, '\s*\|\s*')
return concat($pattern, $field-sep, node-name(current()/*[1]))"
separator="{$line-sep}"/>
<xsl:value-of select="$line-sep"/>
</xsl:template>
</xsl:stylesheet>