我正在寻找以下问题的解决方案:
目前我有这段代码:
<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">
但这不起作用,有什么帮助吗?
答案 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>