在XSLT中,如何使用for-each循环?

时间:2014-12-08 15:37:07

标签: xslt

如果我在屏幕上有一堆字段,说第一个名称为10,姓氏为10,并且它们被命名为firstName1,firstName2等,以及lastName1,lastName2等,我将如何创建一个遍历每个姓氏字段的循环?

现在,我已将其设置为执行十次任务,每个姓氏字段一次。如何设置遍历lastName1,lastName2,lastName3 ... lastName10的for-each循环并为每个循环执行特定任务?

输入XML:

<Arguments> <EnteredBy>SDSADFSADF</EnteredBy> <IDNumber>WERWEW</IDNumber> <Book1>Y</Book1> <LastName1>ASDFASFASDFASFA</LastName1> </Arguments>

XSLT:

<xsl:apply-templates select="/myQuery/Arguments/lastName1"/>

并且还有lastName2到lastName10。

我想遍历十个中的每一个并将姓氏截断为五个字符。

2 个答案:

答案 0 :(得分:3)

XSLT中最简单,最惯用的迭代形式是在要处理的元素集上使用xsl:apply-templates。如果你不知道如何使用这个成语来解决你的问题,那么值得花时间去学习它。

[附录:

例如:

<xsl:template match="/myQuery/Arguments">
  ...
  <xsl:element name="Arguments">
    <xsl:apply-templates/>
  </
  ...
</

<xsl:template match="lastName1 | lastName2 | lastName3
                     | ... | lastName9">
    <xsl:element name="{name()">
      <xsl:value-of select="substring(.,1,5)"/>
    </
</

这假设您有元素名称lastName1lastName2等,而不是简单的习惯用法,其中所有姓氏都被调用(等待它!)lastName,那是什么你想在文档的这个特定部分进行近似身份转换。

XSLT也有一个xsl:for-each,它可以被视为xsl:apply-templates的语法糖,有时候程序员会偏向程序员。但是,如果你认为它与命令式语言中的循环类似,那么你的直觉最终会让你失望,你会感到惊讶,因为你对变量变异的尝试不会像你期望的那样工作。

通过一本好书或教程的系统工作将会有所回报。

答案 1 :(得分:1)

这就是我的工作:

<xsl:template match="/">
  <xsl:element name="Arguments">
    <xsl:apply-templates />
  </xsl:element>
</xsl:template>

<xsl:template match="Arguments">
    <xsl:for-each select="./*[contains(name(), 'LastName')]">
        <xsl:call-template name="test">
        </xsl:call-template>
    </xsl:for-each>    
</xsl:template>

<xsl:template name="test">  
    <xsl:element name="{name()}">
      <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>

这样你就不需要进行9次调用,每个循环只需要一次。

或者如果你想避免for-each,你可以这样做:

<xsl:template match="Arguments/*[contains(name(), 'LastName')]">
   <xsl:element name="{name()}">
     <xsl:value-of select="."/>
   </xsl:element>
</xsl:template>