我正在尝试将我的项目升级到Java8,并且我的项目使用的是Saxon旧版本(我认为是saxon9)。在将我的项目升级到Java 8之后,我遇到了一些问题,在saxonia,我说Java 8问题在Saxon 9.5版本中得到了修复,所以我已经改为Saxon HE 9.7,并且应该只使用HE版本。内置函数saxon:assign和saxon:assignable似乎移到了EE版本。
因此,我正在寻找一种替代方法来实现saxon:assign和saxon:assignable。
有什么建议吗?或者任何有效的例子都会很有帮助。
我的要求与https://www.altova.com/forum/default.aspx?g=posts&t=1000001577中所述的相同。如何增加变量数量?不使用saxon:assign和saxon:assignable。
我想要一个全局变量,并且在处理元素时需要递增。
更新更多的info.This是我的要求。我的输入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创建自定义函数来实现这一点?
发布于 2017-06-06 06:34:18
最好的答案是让自己摆脱对可变变量的使用。这可能需要一种不同的方法,但如果你学会声明式思考,那么一切都是可能的。您需要进行的更改在很大程度上取决于您使用saxon:assign的方式和原因。
如果您不能做到这一点,另一种选择是使用有状态(不纯)扩展函数。
您引用的Altova论坛帖子中的特定示例可以很容易地完成,而不需要使用saxon: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(), '
'"/>
</xsl:for-each>在少数情况下,saxon:assign确实很有用,但绝大多数使用它的情况(包括本例)只是因为样式表作者还没有学会以声明方式而不是过程化方式思考。
后来的
您发布的第二个示例甚至更简单。它所需要的就是:
<xsl:for-each select="employee">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="position()"/></td>
</tr>
</xsl:for-each>https://stackoverflow.com/questions/44373182
复制相似问题