我有一个xml如下。
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
这是一个完整而又简短的转型:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="attributeName[.='salience']">
<salience>
<xsl:value-of select="../value"/>
</salience>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
并应用于提供的XML文档:
<attributes>
<attribute>
<attributeName>agenda-group</attributeName>
<value>common</value>
</attribute>
<attribute>
<attributeName>auto-focus</attributeName>
<value>true</value>
</attribute>
<attribute>
<attributeName>no-loop</attributeName>
<value>true</value>
</attribute>
<attribute>
<attributeName>salience</attributeName>
<value>73</value>
</attribute>
</attributes>
产生了想要的正确结果:
<salience>73</salience>
答案 1 :(得分:0)
试试这个:
<xsl:template match="attributes/attribute">
<xsl:if test=".//attributeName='salience'">
<xsl:value-of select=".//value"/>
</xsl:if>
</xsl:template>
P.S。请格式化您的帖子,因为XSL没有显示。
答案 2 :(得分:0)
主要问题是 xsl:if 声明
<xsl:if test="//attributes//attribute[(attributeName = 'salience')]">
此时,上下文仍然是根节点,所以这一切都是检查现有的 attibute 元素,实际上并没有将自己定位在节点上。因此,当您执行 xsl:value-of 时,您只需在XML中获得第一个值。
您应该尝试匹配属性元素,而不是使用 xsl:if ,而不是
<xsl:apply-templates select="attributes/attribute[attributeName = 'salience']"/>
整个XSLT如下
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates select="attributes/attribute[attributeName = 'salience']"/>
</xsl:template>
<xsl:template match="attribute">
<xsl:element name="{attributeName}">
<xsl:value-of select="value"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
在输入XML上应用时,输出如下:
<salience>73</salience>
请注意 xsl:element
的使用<xsl:element name="{attributeName}">
这样可以避免在匹配模板中对显着性进行硬编码,如果您希望以类似的方式匹配其他元素,则会更加通用。