我想从所有标签中选择某个属性的某个属性的值,其中另一个属性与条件匹配。
例如,如果我的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>