首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >saxon的替代方案:assign和saxon:assignable

saxon的替代方案:assign和saxon:assignable
EN

Stack Overflow用户
提问于 2017-06-06 00:14:16
回答 1查看 590关注 0票数 0

我正在尝试将我的项目升级到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是

代码语言:javascript
复制
<?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>

需要类似如下的输出:

代码语言:javascript
复制
<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,但不起作用。

代码语言:javascript
复制
<?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创建自定义函数来实现这一点?

EN

回答 1

Stack Overflow用户

发布于 2017-06-06 06:34:18

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

如果您不能做到这一点,另一种选择是使用有状态(不纯)扩展函数。

您引用的Altova论坛帖子中的特定示例可以很容易地完成,而不需要使用saxon:assign。这是一个有点奇怪的例子,因为它看起来依赖于属性的顺序,但你可以这样做:

代码语言:javascript
复制
<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确实很有用,但绝大多数使用它的情况(包括本例)只是因为样式表作者还没有学会以声明方式而不是过程化方式思考。

后来的

您发布的第二个示例甚至更简单。它所需要的就是:

代码语言:javascript
复制
<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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44373182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档