XSLT:包含()多个字符串

7

我在XSLT中有一个名为variable_name的变量,如果产品具有名称为A或B或A和B的属性,则我正在尝试将其设置为1

<xsl:variable name="variable_name">
  <xsl:for-each select="product/attributes">
    <xsl:if test="@attributename='A' or @attributename='B'">
      <xsl:value-of select="1"/>
    </xsl:if>
  </xsl:for-each>
</xsl:variable>

是否有办法在if语句中匹配多个字符串,因为我的代码只能匹配A或B是否存在。如果A和B都存在,它不会将变量设置为1。由于我是XSLT的新手,所以希望能得到帮助。


1
当"A和B都存在"时,你的XML是什么样子? - Tomalak
2个回答

16
你可以使用xsl:choose语句,它类似于普通编程语言中的switch语句:
示例:
<xsl:variable name="variable_name">
  <xsl:for-each select="product/attributes">
  <xsl:choose>
    <xsl:when test="@attributename='A'">
      1
    </xsl:when>
    <xsl:when test=" @attributename='B'">
      1
    </xsl:when>
    <!--... add other options here-->
    <xsl:otherwise>1</xsl:otherwise>
  </xsl:choose>
  </xsl:for-each>
</xsl:variable> 

这将使用属性product/attributes的值设置新变量variable_name。
更多信息请参见... http://www.w3schools.comwww.w3schools.com/xsl/el_choose.asp 编辑:根据OP的要求,还有另一种(有点不干净)的方法:
<xsl:variable name="variable_name">
  <xsl:for-each select="product/attributes">
    <xsl:if test="contains(text(), 'A') or contains(text(), 'B')">
       1
    </xsl:if>
  </xsl:for-each>
</xsl:variable> 

如果您提供编写XSLT所用的XML文件,将会很有帮助。

<xsl:variable name="variable_name"> <xsl:for-each select="product/attributes"> xsl:choose <xsl:when test="@attributename='A'"> <xsl:value-of select="1"/> </xsl:when> <xsl:when test="@attributename='B'"> <xsl:value-of select="1"/> </xsl:when> </xsl:choose> </xsl:for-each> </xsl:variable>这个没有起作用... - chugh97
我马上为您调整。但是,您为什么使用for-each语句?您想要实现什么?设置多个变量或将变量的值设置为所有属性值的串联? - anthares
foreach语句从动态XML文件中获取产品属性,因此可能包含许多属性,如a、b、c、d,但我只对a和b感兴趣。 - chugh97
你想让变量的值像“111111”一样出现多次吗?此外,你能展示一下你使用的XML的简单片段吗? - anthares
你可以将元素的属性作为文本获取并使用contains函数,但我认为这是一种丑陋的hack。最好不要这样做。 - anthares
显示剩余5条评论

0

这可能不会有帮助……

拥有两个具有相同名称的XML元素属性(例如<element x="1" x="2" />)是否“合法”?

这是您正在尝试处理的内容吗?尝试通过xmllint或类似工具解析您的XML文件,以查看它是否有效。

xmllint --valid the-xml-file.xml

我猜你会得到一个“属性重定义”错误。


жҸҗзӨәпјҡй—®йўҳ并没жңүиЎЁжҳҺOPжңүдёҖдёӘXMLе…ғзҙ е…·жңүзӣёеҗҢеҗҚз§°зҡ„дёӨдёӘеұһжҖ§пјҢиҜ·еҶҚж¬Ўйҳ…иҜ»гҖӮ ;) - Tomalak
“OP” 是 chugh97 吗?如果是,他们在两个小时前发布的代码使用了 anthares 的建议,这表明他们可能正在重新定义属性。但您提出的发布 XML 的建议非常好。然后我们将看到谁是最佳猜测者。 - philcolbourn
"OP" 是 "original poster" 的缩写,指的是发起帖子的人。 - Tomalak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接