Элемент расширения Xalan - невозможно выбрать переменную - PullRequest
0 голосов
/ 20 февраля 2011

Я написал простое расширение Xalan, которое выбирает узел и возвращает его текст. Процессор XPath работает нормально, пока я не попытаюсь использовать ссылку на переменную. I.e.:

<tst:extract select="node2" /> 

дает правильный результат (содержимое узла), но

<tst:extract select="$var1" />

генерирует ошибку: Переменная не разрешаема: var1 . Мне нужно разрешить как переменные (и параметры шаблона), так и другие выражения XPath.

Возникла аналогичная проблема ( XALANJ-1136 ), но касающаяся функций расширения, а не элементов. Я что-то не так делаю, или это другая ошибка?

Код ниже:

package org.bogus.xalan;

import javax.xml.transform.TransformerException;

import org.apache.xalan.extensions.XSLProcessorContext;
import org.apache.xalan.templates.ElemExtensionCall;
import org.apache.xpath.XPath;
import org.apache.xpath.XPathContext;
import org.apache.xpath.objects.XObject;


public class Test
{
    public String extract(XSLProcessorContext ctx, 
        ElemExtensionCall extensionElement) 
    throws TransformerException
    {
        final String select = extensionElement.getAttribute("select");
        final XPathContext xctxt = ctx.getTransformer().getXPathContext();
        final XPath xpath = new XPath( select, extensionElement, 
            xctxt.getNamespaceContext(), XPath.SELECT);
        final XObject xobj = xpath.execute(xctxt, xctxt.getContextNode(), 
            xctxt.getNamespaceContext());
        if (xobj == null){
            return "NONE FOUND";
        }
        return (String)xobj.castToType(XObject.CLASS_STRING, xctxt);

    }
}

XSLT:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xalan="http://xml.apache.org/xalan"
                xmlns:tst="http://org.bogus/xalan/test"
                extension-element-prefixes="tst"
                >

<xalan:component prefix="tst" elements="extract" >
    <xalan:script lang="javaclass" src="xalan://org.bogus.xalan.Test"/>
</xalan:component>                

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />

<xsl:template match="data">
    <r>
        <value_of_node_1><xsl:value-of select="node1" /></value_of_node_1>
        <value_of_node_2><xsl:value-of select="node2" /></value_of_node_2>

        <xsl:variable name="var1" select="node1" />
        <xsl:variable name="var2">
            <xsl:value-of select="node2" />
        </xsl:variable>

        <xpath_of_var_1><tst:extract select="$var1" /></xpath_of_var_1>
        <xpath_of_var_2><tst:extract select="$var2" /></xpath_of_var_2>
        <xpath_of_node_2><tst:extract select="node2" /></xpath_of_node_2>

        <value_of_var_1><xsl:value-of select="$var1" /></value_of_var_1>
        <value_of_var_2><xsl:value-of select="$var2" /></value_of_var_2>
    </r>
</xsl:template>    
</xsl:stylesheet>    

И сгенерированный результат:

<?xml version="1.0" encoding="UTF-8"?>
<r xmlns:xalan="http://xml.apache.org/xalan">
<value_of_node_1>Node 1 content</value_of_node_1>
<value_of_node_2>node-2-content</value_of_node_2>
<xpath_of_var_1>NONE FOUND</xpath_of_var_1>
<xpath_of_var_2>NONE FOUND</xpath_of_var_2>
<xpath_of_node_2>node-2-content</xpath_of_node_2>
<value_of_var_1>Node 1 content</value_of_var_1>
<value_of_var_2>node-2-content</value_of_var_2>
</r>

file:/E:/xslt/transform.xsl; Line #25; Column #55; Variable not resolvable: var1
file:/E:/xslt/transform.xsl; Line #26; Column #55; Variable not resolvable: var2

Я использую Xalan 2.7.1

1 Ответ

0 голосов
/ 20 февраля 2011

Это своего рода ошибка регрессии, которая была представлена ​​в ревизии 338150 в org.apache.xpath.operations.Variable .Чтобы решить эту проблему, либо переключитесь на Xalan-2.6.0, либо перекомпилируйте xalan и используйте метод execute (XPathContext, boolean) из более ранней версии.

...