XSLT / XPATH属性选择使用另一个属性作为谓词

时间:2017-02-22 15:40:26

标签: xml xslt xpath

我想从所有标签中选择某个属性的值,其中另一个属性与条件匹配。

例如,如果我的XML文档是:

<?xml version="1.0"?>
<doc>
  <mytag txt="alpha" foo="a"></mytag>
  <mytag txt="beta"  foo="b"></mytag>
</doc>

我想使用这样的XSLT文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:for-each select="doc/mytag">
      |<xsl:value-of select="@txt[@foo='a']"/>|
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

获得这样的输出:

|alpha|

相反,没有选择任何内容。

如果我用[xsl:if test =&#34; @foo =&#39; a&#39;&#34;]标记包装[xsl:value-of]标记,它将起作用:< / p>

...
<xsl:for-each select="doc/mytag">
  <xsl:if test="@foo='a'">
    |<xsl:value-of select="@txt"/>|
  </xsl:if>
</xsl:for-each>

但我想尽可能避免这种情况,只是为了节省空间,因为我有20个单独的标签,我想提取。

我猜这是一个xpath问题,但经过相当漫长的搜索,我还没有找到解决方案。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

您正在寻找的语法是......

|<xsl:value-of select="@txt[../@foo='a']"/>|

但是,在||不等于@foo的情况下,这将会遗漏a。所以,你可以做的更多是xsl:for-each而不是

的条件
<xsl:for-each select="doc/mytag[@foo='a']">
  |<xsl:value-of select="@txt"/>|
</xsl:for-each>