Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT if-attribute等于字符串_Xml_Xslt - Fatal编程技术网

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>