0

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

目前我有这个代码:

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

每次我的 source(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>

这种解决方案存在吗?ps 我是 XSLT-Rookie。我读到了一些关于使用带有 * 的 if 测试的内容,如下所示:

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

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

4

3 回答 3

0

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

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

PS请注意,string()在您的原始测试中string(experuserid)=$currentPage/experuserid可能是多余的。如果节点只有一个experuserid子元素,那么它对行为没有影响。如果该节点有多个, experuserid则 usingstring()将意味着您仅检查文档顺序中的第一 experuserid个子节点,而string()如果其中任何一个匹配,则为 true。

于 2013-05-02T16:49:42.010 回答
0

你可能想计算匹配的数量,只有在有一些......像这样的东西时才这样做......

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

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

于 2013-05-02T15:52:47.243 回答
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>
于 2013-05-03T03:25:51.667 回答