2017-06-05 58 views
0

我想升級我的項目到Java 8,我的項目使用撒克遜舊版本(我認爲是saxon9)。在將項目升級到Java 8後,我收到了一些問題,在薩克森說,在Saxon 9.5版本中修復了Java 8問題,因此我已更改爲Saxon HE 9.7,並且應該單獨使用HE版本。內置的函數撒克遜:分配和撒克遜:分配移動到EE版本看起來。撒克遜的替代方案:分配和撒克遜:分配

所以我正在尋找一種實現撒克遜的替代方法:assign和saxon:assignable。

有什麼建議嗎?或者任何工作示例都會有所幫助。

我的要求與https://www.altova.com/forum/default.aspx?g=posts&t=1000001577中所述的相同。如何增加變量計數?不使用撒克遜:分配和撒克遜:可分配。

我想要一個全局變量,並且需要在處理元素時增加。

更新更多信息。這是我的要求。 我輸入的XML是

<?xml version="1.0" encoding="UTF-8"?> 
<employees> 
    <employee> 
     <name>Anbu</name> 
     <address>Chennai</address> 
     <dob>1990-05-15</dob> 
     <phone>9600096000</phone> 
     <email>[email protected]</email> 
    </employee> 
    <employee> 
     <name>Bala</name> 
     <address>Hydrabad</address> 
     <dob>1989-01-04</dob> 
     <phone>9700097000</phone> 
     <email>[email protected]</email> 
    </employee> 
    <employee> 
     <name>Chandru</name> 
     <address>Mumbai</address> 
     <dob>1995-11-10</dob> 
     <phone>9900099000</phone> 
     <email>[email protected]</email> 
    </employee> 
</employees> 

需要輸出,如:

<html> 
    <body> 
     <h2>Employee Details</h2> 
     <table border="1"> 
     <tr bgcolor="#9acd32"> 
      <th style="text-align:left">Name</th> 
      <th style="text-align:left">Age</th> 
     </tr> 
     <tr> 
      <td>Anbu</td> 
      <td>1</td> 
     </tr> 
     <tr> 
      <td>Bala</td> 
      <td>2</td> 
     </tr> 
     <tr> 
      <td>Chandru</td> 
      <td>3</td> 
     </tr> 
     </table> 
    </body> 
</html> 

我想有一個全局變量,並增加它。我曾嘗試使用下面的xsl,但不起作用。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:variable name="count" select="0" /> 
    <xsl:template match="/"> 
     <html> 
      <body> 
       <h2>Employee Details</h2> 
       <table border="1"> 
        <tr bgcolor="#9acd32"> 
         <th style="text-align:left">Name</th> 
         <th style="text-align:left">Age</th> 
        </tr> 
        <xsl:for-each select="employees/employee"> 
         <tr> 
          <td> 
           <xsl:value-of select="name" /> 
          </td> 
          <td> 
           <xsl:value-of select="$count+1" /> 
          </td> 
         </tr> 
        </xsl:for-each> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

我可以通過使用ExtensionFunctionDefinition創建自定義函數來實現此目的嗎?

回答

0

最好的答案是讓自己擺脫使用可變變量。這可能需要一種不同的方法,但如果你學會以聲明的方式思考,那麼一切都是可能的。您需要做出的更改將很大程度上取決於您如何以及爲何使用撒克遜:assign。

如果你不能這樣做,另一種方法是使用有狀態(不純)擴展函數。

你可以很容易的在沒有撒克遜人的情況下完成Altova論壇帖子中的具體示例:assign。這是一個有些奇怪的例子,因爲它似乎取決於屬性的順序上,但你可以做這樣的:

<xsl:variable name="days" 
    select="'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'"/> 

<xsl:variable name="orderedAtts" as="attribute()*"> 
    <xsl:perform-sort select="//content-list/@*"> 
    <xsl:sort select="index-of($days, name())"/> 
    </xsl:perform-sort> 
</xsl:variable> 

<xsl:for-each select="$orderedAtts[.='true']"> 
    <xsl:value-of select="position(), name(), '&#xa;'"/> 
</xsl:for-each> 

有一些情況下,saxon:assign可真有用,但絕大多數情況下的它被使用(包括這一個)僅僅是因爲樣式表作者沒有學會以聲明方式思考而不是程序化地思考。

LATER

您發佈的第二個例子是更簡單。所有它需要的是:

<xsl:for-each select="employee"> 
    <tr> 
    <td><xsl:value-of select="name"/></td> 
    <td><xsl:value-of select="position()"/></td> 
    </tr> 
</xsl:for-each> 
+0

謝謝邁克爾爵士,我已經更新了我的問題與實際的例子。你能提供你的建議嗎? –

+0

完成............. –