撒克逊人的替代方案:assign和saxon:assignable

时间:2017-06-05 16:14:16

标签: java saxon

我正在尝试将我的项目升级到Java 8,我的项目使用Saxon旧版本(我认为是saxon9)。在将我的项目升级到Java 8之后我遇到了一些问题,而在saxonia中说Saxon 9.5版本中修复了Java 8问题,所以我已经改为Saxon HE 9.7并且应该单独使用HE版本。内置函数saxon:assign和saxon:assignable似乎已移至EE版本。

所以我正在寻找一种实现撒克逊的替代方法:assign和saxon:assignable。

有什么建议吗?或者任何有用的例子都会有所帮助。

我的要求与https://www.altova.com/forum/default.aspx?g=posts&t=1000001577中所述相同。如何增加变数?不使用撒克逊人:assign和saxon:assignable。

我想要一个全局变量,并且在处理元素时需要增加。

更新更多信息。这是我的要求。 我的输入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>anbu@email.com</email>
    </employee>
    <employee>
        <name>Bala</name>
        <address>Hydrabad</address>
        <dob>1989-01-04</dob>
        <phone>9700097000</phone>
        <email>bala@email.com</email>
    </employee>
    <employee>
        <name>Chandru</name>
        <address>Mumbai</address>
        <dob>1995-11-10</dob>
        <phone>9900099000</phone>
        <email>chandru@email.com</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创建自定义函数吗?

1 个答案:

答案 0 :(得分:0)

最好的答案是让自己避免使用可变变量。这可能需要一种不同的方法,但如果你学会以声明的方式思考,那么一切皆有可能。您需要做出的更改将在很大程度上取决于您使用saxon的方式和原因:assign。

如果你不能这样做,另一种方法是使用有状态(不纯)扩展函数。

Altova论坛帖子中的具体例子可以很容易地在没有撒克逊人的情况下完成:分配。这是一个有点奇怪的例子,因为它似乎取决于属性的顺序,但你可以这样做:

<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>