Я новичок в XSLT-преобразованиях. Я пишу некоторые преобразования для рефакторинга кода, выраженного в srcML, и я столкнулся с проблемой. Ввод XML, с которым я работаю, выглядит следующим образом:
....
<function><type><name>void</name></type> <name>DrawHorizontal</name>
<parameter_list>(
<param><decl><type><name>t_paper</name></type> <name>p</name></decl></param>,
<param><decl><type><name>int</name></type> <name>x</name></decl></param>,
<param><decl><type><name>int</name></type> <name>y</name></decl></param>)
</parameter_list>
<block>{.....
<expr_stmt><expr>
<name>
<name>p</name>
<index>[<expr><name>x</name></expr>]</index>
<index>[<expr><name>y</name></expr>]</index>
</name>.
<name>hor</name>
<operator>=</operator> 1
</expr>;</expr_stmt>
...
}</block>
</function>
Что я хочу сделать для каждой функциональной секции:
1) Определить имя параметров определенного типа (например, p типа t_paper)
2) Изменить выражение выражения, в котором находятся параметры, определенные на предыдущем шаге ()
Вывод должен выглядеть так:
.....
<function><type><name>void</name></type> <name>DrawHorizontal</name>
<parameter_list>(
<param><decl><type><name>t_paper</name></type> <name>p</name></decl></param>,
<param><decl><type><name>int</name></type> <name>x</name></decl></param>,
<param><decl><type><name>int</name></type> <name>y</name></decl></param>)
</parameter_list>
<block>{.....
<expr_stmt><expr>
<name>p</name>.
<name>
<name>data</name>
<index>[<expr><name>x</name></expr>]</index>
<index>[<expr><name>y</name></expr>]</index>
</name>.
<name>hor</name>
<operator>=</operator> 1
</expr>;</expr_stmt>
...
}</block>
</function>
Таким образом, мне нужно преобразовывать узлы expr_stmt только там, где находятся параметры определенного типа (t_paper в примере). Остальная часть файла должна быть скопирована как есть.
Моя проблема в том, что я не могу применять шаблоны к этим конкретным разделам на основе динамически создаваемых условий (имен параметров).
Некоторый НЕ работающий код выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<xsl:template match="//function">
<xsl:choose>
<xsl:when test="parameter_list/param/decl/type/name='t_paper'">
<xsl:copy>
<xsl:call-template name="transform-function" select="node()">
<xsl:with-param name="appearance" select="parameter_list/param/decl/name" />
</xsl:call-template>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<function><xsl:apply-templates select="node()"/></function>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="transform-function">
<xsl:param name="appearance" />
<xsl:if test="//expr_stmt/expr/name/name=$appearance">
substitution here
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Я был бы очень признателен, если бы кто-нибудь дал мне подсказку.
Пожалуйста, дайте мне знать, если вам нужно больше подробностей, так как это мой первый вопрос в SO.
Приветствия
D.