XSLT: как узнать, что я вошел в любой из нескольких для каждого? - PullRequest
0 голосов
/ 07 октября 2009

У меня есть несколько <xsl:for-each/>, которые запускают один за другим. Я хотел бы, в конце концов, что-то сделать, если я не прошел ни в одном из них. Только для одного for-each я могу сделать <xsl:choose/> с соответствующим тестом, основанным на селекторе в for-each, но для многих из них он становится очень уродливым.

Есть ли у кого-нибудь решение для отслеживания прохода через несколько for-each?

Ответы [ 2 ]

3 голосов
/ 07 октября 2009

Если у вас есть что-то вроде:

<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>

, затем вы можете создать объединение наборов узлов, выбранных в каждом for-each, и, если этот набор узлов пуст, сделать что-то еще:

<xsl:if test="not(foo[@bar] | foo[@fap])">
    <!-- there weren't any nodes matched above, so do something else -->
</xsl:if>

РЕДАКТИРОВАТЬ: В случае, когда ваши выражения 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>
0 голосов
/ 07 октября 2009

Вы можете использовать <xsl:variable>, чтобы установить локальную переменную, в соответствии с которой для каждого вы ввели, и затем проверить, если с <xsl:if> в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...