2012-02-16 44 views
0

回答本網站上的另一個XSLT問題,我偶然發現XSLT 1.0和2.0之間的區別,我不明白。誰能解釋這裏發生的事情,以及如何解決這些差異?
注意:我正在使用XML Spy版本2011 sp1(x64)。模板規則處理的區別XSLT 1.0 vs 2.0

我輸入XML是

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <Manager grade="10" id="26"> 
     <Employee id="1" grade="9"/> 
     <Employee id="2" grade="8"/> 
    </Manager> 
    <Manager grade="10" id="27"> 
     <Employee id="3" grade="9"/> 
     <Employee id="4" grade="8"/> 
     <Employee id="5" grade="4"/> 
    </Manager> 
    <Manager grade="7" id="28"> 
     <Employee id="6" grade="8"/> 
     <Employee id="7" grade="7"/> 
     <Employee id="8" grade="6"/> 
     <Employee id="9" grade="9"/> 
    </Manager> 
    <Manager grade="9" id="29"> 
     <Employee id="10" grade="9"/> 
     <Employee id="11" grade="8"/> 
     <Employee id="12" grade="7"/> 
    </Manager> 
</root> 

我想選擇有等級大於或等於經理級設定員工。爲此,我寫了下面的1.0變換:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="/"> 
     <root> 
      <xsl:apply-templates select="root/Manager"/> 
     </root> 
    </xsl:template> 

    <xsl:template match="Manager"> 
     <mgr> 
      <managerId><xsl:value-of select="@id"/></managerId> 
      <managerGrade><xsl:value-of select="@grade"/></managerGrade> 
      <empsSelection> 
       <xsl:copy-of select="Employee[@grade &gt;= ../@grade]"/> 
      </empsSelection> 
     </mgr> 
    </xsl:template> 
</xsl:stylesheet> 

輸出被預期

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <mgr> 
     <managerId>26</managerId> 
     <managerGrade>10</managerGrade> 
     <empsSelection/> 
    </mgr> 
    <mgr> 
     <managerId>27</managerId> 
     <managerGrade>10</managerGrade> 
     <empsSelection/> 
    </mgr> 
    <mgr> 
     <managerId>28</managerId> 
     <managerGrade>7</managerGrade> 
     <empsSelection> 
      <Employee id="6" grade="8"/> 
      <Employee id="7" grade="7"/> 
      <Employee id="9" grade="9"/> 
     </empsSelection> 
    </mgr> 
    <mgr> 
     <managerId>29</managerId> 
     <managerGrade>9</managerGrade> 
     <empsSelection> 
      <Employee id="10" grade="9"/> 
     </empsSelection> 
    </mgr> 
</root> 

但是,當我改變XSLT版本2.0(採取上述的樣式表和變化樣式表/ @版本2.0) ,我得到下面的不同和意想不到的結果:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <mgr> 
     <managerId>26</managerId> 
     <managerGrade>10</managerGrade> 
     <empsSelection> 
      <Employee id="1" grade="9"/> 
      <Employee id="2" grade="8"/> 
     </empsSelection> 
    </mgr> 
    <mgr> 
     <managerId>27</managerId> 
     <managerGrade>10</managerGrade> 
     <empsSelection> 
      <Employee id="3" grade="9"/> 
      <Employee id="4" grade="8"/> 
      <Employee id="5" grade="4"/> 
     </empsSelection> 
    </mgr> 
    <mgr> 
     <managerId>28</managerId> 
     <managerGrade>7</managerGrade> 
     <empsSelection> 
      <Employee id="6" grade="8"/> 
      <Employee id="7" grade="7"/> 
      <Employee id="9" grade="9"/> 
     </empsSelection> 
    </mgr> 
    <mgr> 
     <managerId>29</managerId> 
     <managerGrade>9</managerGrade> 
     <empsSelection> 
      <Employee id="10" grade="9"/> 
     </empsSelection> 
    </mgr> 
</root> 

這是爲什麼,以及如何應樣式表,以獲得正確的結果在這兩個XSLT 1.0和2.0版本改變?

回答

1

我想用XSLT 2.0您在默認情況下得到的比較作爲字符串,而用XSLT 1.0比較運算符將任何操作數爲數字第一然後將其進行比較,以便用XSLT 2.0需要

<xsl:template match="Manager"> 
    <mgr> 
     <managerId><xsl:value-of select="@id"/></managerId> 
     <managerGrade><xsl:value-of select="@grade"/></managerGrade> 
     <empsSelection> 
      <xsl:copy-of select="Employee[number(@grade) &gt;= number(current()/@grade)]"/> 
     </empsSelection> 
    </mgr> 
</xsl:template> 

得到的結果你要。當然,使用其他數字類型(如xs:integer(@grade))也應該如此。

+0

解決了它(數字功能也可用於1.0) - 謝謝! – Maestro13 2012-02-16 12:48:50

+0

仔細檢查細節,確實字符串比較解釋了這一切。例如,第一個管理項:(「9」> =「10」,「8」> =「10」)給出(true,true) – Maestro13 2012-02-16 15:37:27