我想用select distinct这样的函数提取唯一值。 最终我最终使用xsl:key组合for-each。我设法获得了模型的独特价值,但我无法提取属于该模型的风格。
我试图整理一个示例XML。
<PLAYER>
<ALBUM>
<MODEL>AA</MODEL>
<STYLE>BB</STYLE>
<NUMBER>1</NUMBER>
</ALBUM>
<ALBUM>
<MODEL>FF</MODEL>
<STYLE>GG</STYLE>
<NUMBER>2</NUMBER>
</ALBUM>
<ALBUM>
<MODEL>AA</MODEL>
<STYLE>BB</STYLE>
<NUMBER>3</NUMBER>
</ALBUM>
<ALBUM>
<MODEL>FF</MODEL>
<STYLE>GG</STYLE>
<NUMBER>4</NUMBER>
</ALBUM>
<ALBUM>
<MODEL>HH</MODEL>
<STYLE>JJ</STYLE>
<NUMBER>5</NUMBER>
</ALBUM>
</PLAYER>
我需要提取MODEL的唯一值,并将其与STYLE匹配。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:key name="model" match="/player/album/model/text()" use="." />
<xsl:template match="/">
<xsl:for-each select="/player/album/model/text()[generate-id()
= generate-id(key('model',.)[1])]">
<li>
<xsl:value-of select="model"/>
</li>
<li>
<xsl:value-of select="style"/>
</li>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
通缉结果:
<MODEL>AA</MODEL>
<STYLE>BB</STYLE>
<MODEL>FF</MODEL>
<STYLE>GG</STYLE>
<MODEL>HH</MODEL>
<STYLE>JJ</STYLE>
是否有可能提取这些独特的价值对?
答案 0 :(得分:1)
XML(实际上是XSLT)区分大小写,因此XSLT中xpath中的player
与XML中的PLAYER
不匹配(对于其他节点也类似)。
此外,您的xsl:for-each
正在选择文本节点,因此正在<xsl:value-of select="model"/>
正在寻找一个名为model
的子节点,该节点显然不存在。
您可以将表达式更改为<xsl:value-of select="../../MODEL"/>
,但最好只更改密钥以匹配ALBUM
个节点。
试试这个XSLT ....
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:key name="model" match="/PLAYER/ALBUM" use="MODEL" />
<xsl:template match="/">
<xsl:for-each select="/PLAYER/ALBUM[generate-id() = generate-id(key('model',MODEL)[1])]">
<li>
<xsl:value-of select="MODEL"/>
</li>
<li>
<xsl:value-of select="STYLE"/>
</li>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我不确定您的确切需求结果是什么,因为问题显示<MODEL>AA</MODEL><STYLE>BB</STYLE>
是想要的结果,但XSLT正在输出LI
标签,但它很容易适应。