2013-06-19 28 views
0

我有從XML到TXT文件的XSLT轉換,這給我帶來了問題。javascript xml節點相等比較在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(即工人)節點I具有使用僅Turno(即工作班),其滿足一個節點,以產生單個行某些商業狀況(即成爲當天的第一次轉變)。在這個例子中,只有BORSA行應該通過測試。

問題是輸出中沒有東西:沒有節點通過DaStampare(this)測試,它檢查條件(請參見下面的xsl源代碼)。

相反,如果我在HTML頁面中複製並粘貼所有的腳本區域逐字運行簡單的JavaScript,加載到內存中該XML,我得到正確的結果:第一個節點不通過測試但第二呢!

通過日誌記錄我將問題隔離到一個函數,該函數測試兩個變量之間的相等性,一個是當前節點,另一個是兄弟中的「好」節點。

爲什麼在XSLT轉換中運行這個測試時會出現錯誤,但如果在網頁中運行則爲true?

編輯我要明確指出:這是的能夠運行這個XSLT內的JavaScript的一個問題。如果我調整了函數,我會看到結果中的相應更改。 DaStampare函數被調用,我對此很肯定。它沒有像我期望的那樣行爲END編輯

不知道它是否相關,但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;[email protected];+../@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 

回答

0

跑時,該測試提供虛假在XSLT轉換中,但如果在網頁中運行,則爲true,因爲失敗的測試是使用嵌入式JavaScript完成的。
XSLT的任務是處理轉換並創建包含該javascript代碼的文本/數據/代碼。運行JavaScript代碼不是XSLT的任務。
如果在網頁中運行,瀏覽器不僅會處理XSLT,還會運行javascript。

+0

我不知道我明白:xslt可以運行javascript,在我的應用程序中有幾十個這樣的實例,即使在測試中也是如此。你什麼意思? – Piddu

+0

@Piddu:普通XSLT無法運行Javascript。它沒有在版本1.0或2.0的規範中提到。通常的XSLT引擎,例如libexslt(見http://xmlsoft.org/XSLT/EXSLT,用於PHP,很多瀏覽器等)無法運行JavaScript,但能夠創建JavaScript源代碼,因爲它們可以創建幾乎任何文本。在這種情況下,您的環境似乎無法添加javascript支持。如果它通常在xsl內工作:if,那麼必須有一個缺失的預處理步驟。 – Andreas

+0

再次,抱歉,但這不是重點 – Piddu