如果我在屏幕上有一堆字段,说第一个名称为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。
我想遍历十个中的每一个并将姓氏截断为五个字符。
答案 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)"/>
</
</
这假设您有元素名称lastName1
,lastName2
等,而不是简单的习惯用法,其中所有姓氏都被调用(等待它!)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>