XSLT:如何知道我为每个人进入了其中的任何一个?

XSLT:如何知道我为每个人进入了其中的任何一个?,xslt,foreach,Xslt,Foreach,我有几个,它们一个接一个地运行。最后,如果我没有通过任何考试,我想做点什么。对于每个只有一个,我可以根据For each中的选择器,通过适当的测试来制作一个,但是对于很多人来说,它开始变得非常难看 有没有人能找到一个解决方案来跟踪每个人通过多个?的情况,假设你有: <xsl:for-each select="foo[@bar]"> <!-- do stuff for foo elements having a bar attribute --> </xsl:

我有几个
,它们一个接一个地运行。最后,如果我没有通过任何考试,我想做点什么。对于每个只有一个
,我可以根据For each中的选择器,通过适当的测试来制作一个
,但是对于很多人来说,它开始变得非常难看


有没有人能找到一个解决方案来跟踪每个人通过多个

的情况,假设你有:

<xsl:for-each select="foo[@bar]">
    <!-- do stuff for foo elements having a bar attribute -->
</xsl:for-each>

<xsl:for-each select="foo[@fap]">
    <!-- do stuff for foo elements having a fap attribute -->
</xsl:for-each>
编辑:在节点集选择XPath表达式非常复杂的情况下,可以通过使用具有有意义名称的变量来简化操作;例如:

<xsl:variable name="articles" select="stuff/that/is[3]/very[@deeply-nested and position() &lt; 5]"/>
<xsl:variable name="comments" select="stuff/that/is[1]/very[@deeply-nested and position() &gt; 27]"/>
<xsl:variable name="rants" select="stuff/that/is[17]/even/more[@deeply-nested and position() &lt; 5]/with/some/more/nesting"/>

<h1>Ramblings</h1>

<xsl:for-each select="$articles">
    <!-- do stuff with articles -->
    <h2>Article <xsl:value-of select-"position()"/></h2>
</xsl:for-each>

<xsl:for-each select="$comments">
    <!-- do stuff with comments -->
    <h2>Comment <xsl:value-of select-"position()"/></h2>
</xsl:for-each>

<xsl:for-each select="$rants">
    <!-- do stuff with rants -->
    <h2>Rant <xsl:value-of select-"position()"/></h2>
</xsl:for-each>

<xsl:if test="not($articles | $comments | $rants)">
    <!-- nobody had anything to say... -->
    <h2>Nothing to see here</h2>
</xsl:if>

漫无边际
文章
评论
咆哮
这里没什么可看的

您可以使用
设置一个局部变量,根据您输入的每个变量设置一个局部变量,然后在最后使用
测试是否存在。

是的,这正是我实际上试图避免的…:)不管怎样,谢谢。出于好奇,你为什么要避开它?这种set操作的使用正是XSLT/XPath的定义:-)@subtenant:您无法检查脚本的某个部分是否执行,XSLT不是这样设计的。但是,您可以检查是否满足执行某个部分的条件。从XSLT的角度来看,这是完全相同的。@Nick:因为测试将非常长,而且根本不容易维护。但如果没有别的办法,我想只好这样了。非常感谢。@subtenant:通过将节点集指定给变量,可以使事情更容易理解;我将用一个例子来更新我的答案。这是行不通的:变量的作用域将限定在for each的内部,因此在外部不可见。在外部定义的变量无法在for-each中更改其值。尼克是对的,我尝试了此操作,但您必须在之前定义该变量,从而影响该变量的值。那么您就不能更改它,这样它就没用了。仅供参考,我已经扩展了我的答案,以展示当您有很多又大又难看的XPath表达式时,如何使内容更具可读性:-)
<xsl:variable name="articles" select="stuff/that/is[3]/very[@deeply-nested and position() &lt; 5]"/>
<xsl:variable name="comments" select="stuff/that/is[1]/very[@deeply-nested and position() &gt; 27]"/>
<xsl:variable name="rants" select="stuff/that/is[17]/even/more[@deeply-nested and position() &lt; 5]/with/some/more/nesting"/>

<h1>Ramblings</h1>

<xsl:for-each select="$articles">
    <!-- do stuff with articles -->
    <h2>Article <xsl:value-of select-"position()"/></h2>
</xsl:for-each>

<xsl:for-each select="$comments">
    <!-- do stuff with comments -->
    <h2>Comment <xsl:value-of select-"position()"/></h2>
</xsl:for-each>

<xsl:for-each select="$rants">
    <!-- do stuff with rants -->
    <h2>Rant <xsl:value-of select-"position()"/></h2>
</xsl:for-each>

<xsl:if test="not($articles | $comments | $rants)">
    <!-- nobody had anything to say... -->
    <h2>Nothing to see here</h2>
</xsl:if>