javascript xml节点在XSLT中的函数中的相等性比较失败

时间:2013-06-19 10:19:03

标签: javascript xml xslt-1.0

我有从XML到TXT文件的XSLT转换,这给我带来了问题。

源文件如下所示:

<ExportAssegnazioniOperatori DataDal="15/04/2013" DataAl="15/04/2013" DataExport="19/06/2013" OraExport="10:19" ErroriInExport="false">
<AreaAziendale CodiceIE="14" CodiceIEAzienda="" Descrizione="Redazione TG5">
    <Data Giorno="15042013" Festivo="false" Prefestivo="false" Postfestivo="false" NumeroGiorno="735338">
        <Operatore CodiceIEOLD="09000365" CodiceIE="09000365" Matricola="09000365" Badge="" Cognome="RICCETTI" Nome="LAURA" CodiceIEReparto="" CodiceIERapportoLavorativo="" StatoOperatore="L">
            <Turno CodiceIEOLD="XTRA" CodiceIE="XTRA" Descrizione="FUORI SEDE" DescrizioneSintetica="FUORI SEDE" DescrizioneTipologiaTurno="&lt;Nessuna tipologia turno&gt;" Riposo="false" Reperibilita="false" OraInizioTurno="0000" OraFineTurno="0000" NumeroOreTurno="0000" OraInizio="0000" OraFine="0000" NumeroOre="0000" NumeroOreStraordinario="0000" NumeroOreEccedenza="0000" TipoElaborazione="0" TurnoSpeciale="false" TurnoNotturno="false" StatoAssegnazione="1" CodiceIEReparto="" SestoGiornoLavorativo="false" ModalitaOperazione="2" TipoGiornata="1" NotaOperatore="" Pubblicato="false"/>
            <Turno CodiceIEOLD="BORSA" CodiceIE="BORSA" Descrizione="BORSA" DescrizioneSintetica="BORSA" DescrizioneTipologiaTurno="TURNO A" Riposo="false" Reperibilita="false" OraInizioTurno="0600" OraFineTurno="1315" NumeroOreTurno="0715" OraInizio="0600" OraFine="1315" NumeroOre="0715" NumeroOreStraordinario="0000" NumeroOreEccedenza="0000" TipoElaborazione="0" TurnoSpeciale="false" TurnoNotturno="false" StatoAssegnazione="1" CodiceIEReparto="" SestoGiornoLavorativo="false" ModalitaOperazione="2" TipoGiornata="1" NotaOperatore="" Pubblicato="false"/>
        </Operatore>
    </Data>
</AreaAziendale>
</ExportAssegnazioniOperatori>

逻辑是,对于每个Operatore(即工作者)节点,我必须使用满足特定业务条件的唯一Turno(即工作班次)节点生成单行(即,是当天的第一班)。在此示例中,只有BORSA行应通过测试。

问题是输出中没有任何内容:没有节点通过DaStampare(this)测试,该测试检查条件(参见下面的xsl源代码)。

相反,如果我将所有脚本区域 verbatim 复制并粘贴到html页面中以运行简单的javascript,从磁盘加载该xml,我得到正确的结果:第一个节点没有'通过测试,但第二次测试!

通过记录我将问题隔离到一个函数,该函数测试两个变量之间的相等性,一个是当前节点,另一个是兄弟姐妹中的“好”节点。

为什么在XSLT转换中运行时,此测试会给我错误,但如果在网页内运行,则为true?

编辑让我说清楚:这是能够在此XSLT中运行javascript的问题。如果我调整函数,我会看到结果中的相应更改。 DaStampare函数被调用,我对此持肯定态度。它表现得不像我期望的那样 END EDIT

不知道它是否相关,但是从经典ASP调用XSLT转换。

XSLT就是这个(我认为这是1.1版本)。 DaStampare函数被剥离以使其更具可读性,这不是完整的逻辑:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:script>
    <![CDATA[
function DaStampare(objTurno)
{
    var primoDiurno = null;
    for (i = 0; i < objTurno.parentNode.childNodes.length; i++)
    {
        var objSibling = objTurno.parentNode.childNodes(i);
        // Fake test: here i actually check a bunch of business conditions to find the good node
        if(objSibling.getAttribute("CodiceIE") == "BORSA")
        {
                primoDiurno = objSibling;
        }
    }

    if(primoDiurno != null)
    {
        if(objTurno == primoDiurno) // <--**** THIS IS THE TEST THAT FAILS: IT RETURNS FALSE INSIDE THE XSLT, TRUE INSIDE THE HMTL PAGE
            return true;
    }

    return false;
}
]]>
</xsl:script>

<xsl:template match="param-descrizione">RPA</xsl:template>

<xsl:template match="/">
    <xsl:apply-templates select="./ExportAssegnazioniOperatori/AreaAziendale/Data/Operatore" order-by="+../../@Descrizione;+@CodiceIE;+../@NumeroGiorno"/>
</xsl:template>

<xsl:template match="Operatore">
</xsl:template>

<xsl:template match="Operatore[Turno]">
    <xsl:if test="@CodiceIE[. != '']">
        <xsl:apply-templates select="Turno" />
    </xsl:if>
</xsl:template>

<xsl:template match="Turno">
    <xsl:if expr="DaStampare(this)">
            <xsl:eval>this.getAttribute("CodiceIE")</xsl:eval> + ...
   </xsl:if>
</xsl:template>

这是我初始化html页面的方式

var doc = new ActiveXObject("Microsoft.XMLDOM")
doc.setProperty("SelectionLanguage", "XPath");
doc.async = false;
doc.load("nott.xml");

var nodes = doc.selectNodes("//Turno");
 var a1 =  DaStampare(nodes[0]); // THIS IS FALSE
var a2 = DaStampare(nodes[1]); // THIS IS TRUE

1 个答案:

答案 0 :(得分:0)

此测试在XSLT转换内部运行时给出错误,但如果在网页内部运行则为true,因为失败的测试是使用嵌入式javascript完成的。​​
XSLT的任务是处理转换并创建包含该javascript代码的文本/数据/代码。运行javascript代码不是XSLT的任务 如果在网页中运行,浏览器不仅会处理XSLT,还会运行javascript。