Xml XSLT if-attribute等于字符串
我使用Xml XSLT if-attribute等于字符串,xml,xslt,Xml,Xslt,我使用xsl:if在一个更大的xsl:template块中执行一个小条件,我想测试当前xsl:template匹配节点的属性是否相等 以下操作不起作用: <xsl:template match="sometag[@type='sometype']"> ==Sometag== <xsl:if test="@something!='hidden'">something</xsl:if> <!--a lot of other stuff
xsl:if
在一个更大的xsl:template
块中执行一个小条件,我想测试当前xsl:template
匹配节点的属性是否相等
以下操作不起作用:
<xsl:template match="sometag[@type='sometype']">
==Sometag==
<xsl:if test="@something!='hidden'">something</xsl:if>
<!--a lot of other stuff that I don't want to duplicate by multiplying the xsl:templates-->
<xsl:template>
第二个标签不应打印“某物”部分
我不完全确定你想要实现什么,但我会试试看
其中一个sometag
元素根本没有something
属性。没有此属性与@something!='隐藏“
。因此,如果something
属性不存在,则不会输出字符串“something”
因此,在计算xsl:if
条件之前,需要测试是否存在something
属性
输入
<?xml version="1.0" encoding="utf-8"?>
<root>
<sometag type="sometype" something="visible"/>
<sometag type="sometype" something="hidden"/>
<sometag type="sometype"/>
</root>
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/root">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="sometag[@type='sometype']">
<xsl:text>==Sometag==</xsl:text>
<xsl:choose>
<xsl:when test="@something">
<xsl:if test="@something!='hidden'">
<xsl:text>something</xsl:text>
</xsl:if>
</xsl:when>
<xsl:otherwise>
<xsl:text>something</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
==Sometag==something==Sometag====Sometag==something
基于上述解决方案(由@Mathias Müller提出,并由@Tim C提出),您甚至可以使用
或来加快速度:
<xsl:template match="sometag[@type='sometype']">
<xsl:text>==Sometag==</xsl:text>
<xsl:if test="not(@something) or @something!='hidden'">
<xsl:text>something</xsl:text>
</xsl:if>
</xsl:template>
==Sometag==
某物
如果不存在属性something
,则If子句的计算结果已为true
,表达式@something!='隐藏的“
不需要计算。可能有更好的方法来组织样式表。请显示您的XML输入文件和更多XSLT上下文(如果不是整个样式表的话)。@MathiasMüller我已经显示了一个示例XML和我想要的:第二个标记不应该打印“某物”部分。请回答xsl:if
问题。我的XSLT要大得多,我希望继续使用xsl:if
标记,而不是重新组织所有内容。我猜这个模板没有执行,或者以前的XSLT把事情搞砸了。请提供完整的XSLT…您的实际XML是否有名称空间?另外,您确定您的属性名称没有输入错误吗?如果属性“something”不存在,测试将计算为false。您可能需要执行
而不是(@something='hidden')
也可以。您当前的=代码>测试询问当前节点是否具有值未“隐藏”的属性,非
版本询问当前节点是否具有值为“隐藏”的属性。
<xsl:template match="sometag[@type='sometype']">
<xsl:text>==Sometag==</xsl:text>
<xsl:if test="@something!='hidden' or not(@something)">
<xsl:text>something</xsl:text>
</xsl:if>
</xsl:template>
==Sometag==something==Sometag====Sometag==something
<xsl:template match="sometag[@type='sometype']">
<xsl:text>==Sometag==</xsl:text>
<xsl:if test="not(@something) or @something!='hidden'">
<xsl:text>something</xsl:text>
</xsl:if>
</xsl:template>