搜索适用于<xsl:for-each> </xsl:for-each>的IF-ANY解决方案

时间:2013-05-02 15:40:41

标签: xslt

我正在寻找以下问题的解决方案:

目前我有这段代码:

<div class="box">
              <div class="header">
                <h2>Item</h2>
              </div>
   </div>
<xsl:for-each select="umbraco.library:GetXmlNodeById($source)/* [name() = $documentTypeAlias and string(umbracoNaviHide) != '0']">
<xsl:if test="string(experuserid)=$currentPage/experuserid">


  <xsl:value-of select="@nodeName"/>
                <xsl:value-of select="subtitel"/>
  <a href="{umbraco.library:NiceUrl(@id)}" class="readmore">
 Lees meer         
    </a>
    </div>

  </xsl:if>
</xsl:for-each>

此代码生成结果 - 每次我的源(experuserid)等于我的currentpage / experuserid。

问题是当测试结果为负时,并且没有与当前页面匹配的experuserid。我想这样做,以便在发生这种情况时,我的布局也不会显示。因此我需要这样的东西:

<xsl:if-any test="string(experuserid)=$currentPage/experuserid">
    <div class="box">
                  <div class="header">
                    <h2>Item</h2>
                  </div>
       </div>
    <xsl:for-each select="umbraco.library:GetXmlNodeById($source)/* [name() = $documentTypeAlias and string(umbracoNaviHide) != '0']">
    <xsl:if test="string(experuserid)=$currentPage/experuserid">


      <xsl:value-of select="@nodeName"/>
                    <xsl:value-of select="subtitel"/>
      <a href="{umbraco.library:NiceUrl(@id)}" class="readmore">
     Lees meer         
        </a>
        </div>

      </xsl:if>
    </xsl:for-each>
    <xsl:if-any>

这种解决方案是否存在?附:我是XSLT-Rookie。我读了一些关于使用带有*的if测试的东西:

<xsl:if test="*string(experuserid)=$currentPage/experuserid">

但这不起作用,有什么帮助吗?

3 个答案:

答案 0 :(得分:0)

你可能想要计算匹配的数量,只有在有一些......这样的事情时才会这样做......

<xsl:if test="count( child::Page[experuserid = string(experuserid)] ) > 0">
 <div ... blah ... />
</xsl:if>

不完全确定“string(experuserid)”正在做什么(除了显然将当前节点的名为experuserid的子节点中包含的文本编号转换为字符串,它已经存在),您将其呈现为你的例子,所以我重新使用它...但我没有上下文来确定它的有效性。

答案 1 :(得分:0)

我会先进行过滤,而不是在for-each中使用<xsl:if>,例如。

<xsl:variable name="interestingNodes"
    select="umbraco.library:GetXmlNodeById($source)/*
       [name() = $documentTypeAlias and string(umbracoNaviHide) != '0']
       [experuserid=$currentPage/experuserid]"/>

这将仅在变量中存储您实际感兴趣的节点(即具有正确experuserid的那些节点),当然这些节点可能都不是。现在你可以简单地说

<xsl:if test="$interestingNodes"><!-- true if $interestingNodes is non-empty -->
  <div class="box">
    ...
  </div>
  <xsl:for-each select="$interestingNodes">
    <xsl:value-of select="@nodeName"/>
    ...
  </xsl:for-each>
</xsl:if>

P.S。请注意,string()原始测试中的string(experuserid)=$currentPage/experuserid可能是多余的。如果节点只有一个experuserid子元素,那么它对行为没有任何影响。如果该节点有多个 experuserid,那么使用string()将意味着您只按文档顺序检查第一个 experuserid子项,如果没有string(),如果它们中的任何一个匹配,那将是真的。

答案 2 :(得分:0)

只需使用

<xsl:for-each select=
"umbraco.library:GetXmlNodeById($source)/* 
       [name() = $documentTypeAlias and string(umbracoNaviHide) != '0']
       [string(experuserid)=$currentPage/experuserid]
">

  <!-- Your other code here -->

</xsl:for-each>