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 ソースを参照)。

代わりに、すべてのスクリプト領域をそのままコピーして html ページに貼り付け、単純な JavaScript を実行し、その xml をディスクからロードすると、正しい結果が得られます。最初のノードはテストに合格しませんが、2 番目のノードは合格します!

ログを記録することで、2 つの変数間の等価性をテストする関数に問題を切り分けました。1 つは現在のノードで、もう 1 つは兄弟間の「適切な」ノードです。

このテストを XSLT 変換内で実行すると false になるのに、Web ページ内で実行すると true になるのはなぜですか?

EDITはっきりさせておきます: これは、この XSLT 内で JavaScript を実行できるという問題ではありません。関数を微調整すると、対応する変更が結果に表示されます。関数が呼び出されます。DaStampare私はそれについて肯定的です。END EDITに期待するように動作しません

関連するかどうかはわかりませんが、XSLT 変換は従来の ASP から呼び出されます。

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
4

1 に答える 1

0

このテストは、XSLT 変換内で実行された場合は false になりますが、Web ページ内で実行された場合は true になります。
XSLT のタスクは、変換を処理し、その JavaScript コードを含むテキスト/データ/コードを作成することです。JavaScript コードを実行するのは XSLT の役割ではありません。
Web ページで実行すると、ブラウザは XSLT を処理するだけでなく、javascript も実行します。

于 2013-06-19T11:11:54.713 に答える