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:value]标记用[xsl:if test ="@foo ='a'"]标记,则它将起作用:

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

但是,如果可能的话,我想避免使用,只是为了节省空间,因为我想提取20个单独的标签。

我猜这是一个XPATH问题,但是经过相当漫长的搜索,我没有找到解决方案。任何帮助都将不胜感激。

您要寻找的语法是这个....

|<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>

似乎使用模板更好地完成了:

<transform xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <output method="text"/>
    <template match="child::doc/child::mytag[count(attribute::foo) = 1 and (string(attribute::foo) = 'a' or string(attribute::foo) = 'c')]">
        <value-of select="concat('|', string(attribute::txt), '|')"/>
    </template>
</transform>

最新更新