我正在尝试将我的项目升级到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创建自定义函数吗?
答案 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(), '
'"/>
</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>