Как передать параметр из одного шаблона XSLT в другой? - PullRequest
0 голосов
/ 23 ноября 2011

У меня проблемы с передачей параметра в шаблон.

<!-- // Product / Instances -->
<xsl:template match="/data/products/instances">
    <ul>
        <xsl:apply-templates select="item">
            <xsl:with-param name="idp" select="@id"/>
        </xsl:apply-templates>
    </ul>
</xsl:template>

<!-- // Product / Instances / Instance -->
<xsl:template match="/data/products/instances/item">
    <xsl:param name="idp"/>
    <p>$idp: <xsl:value-of select="$idp"/></p> <!-- $idp is empty -->
    <xsl:for-each select="/data/instances/entry">
        <xsl:if test="@id = $idp">
            <p><xsl:value-of select="code"/></p>
        </xsl:if>
    </xsl:for-each>
</xsl:template>

/data/products/instances/item имеет атрибут с именем id, который имеет целое значение.

Хотявторой шаблон и цикл for-each обрабатываются (я проверял их, выводя из них фиктивные выходные данные), значение параметра $idp не передается во второй шаблон.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 23 ноября 2011

Проблема заключается в том, что при выполнении шаблонов apply ваш текущий контекст находится на элементе instance , поэтому атрибут @ id относится к идентификатору атрибута *Элемент 1005 * instance , а не атрибут элементов item , которые вы собираетесь выбрать (которые еще не были выбраны в тот момент).

В данном примере,на самом деле нет необходимости передавать параметр.Вместо этого просто используйте переменную в соответствующем шаблоне.Вместо xsl: param выполните следующие действия:

<xsl:variable name="idp" select="@id"/>

Получите для вас значение атрибута id , поскольку вы находитесь на элемент элемент в этой точке.

1 голос
/ 23 ноября 2011

Вам нужно будет показать достаточно деталей, чтобы мы могли воспроизвести проблему, иначе трудно сказать, что идет не так.

Я думаю, вам не нужен какой-либо параметр, и вы должны использовать ключ

<xsl:key name="k1" match="data/instances/entry" use="@id"/>

<!-- // Product / Instances -->
<xsl:template match="/data/products/instances">
    <ul>
        <xsl:apply-templates select="item"/>
    </ul>
</xsl:template>

<!-- // Product / Instances / Instance -->
<xsl:template match="/data/products/instances/item">

    <xsl:for-each select="key('k1', @id)">

            <p><xsl:value-of select="code"/></p>

    </xsl:for-each>
</xsl:template>
...