XSL 如何 select 来自一个不同值的多个值
XSL How to select multiple values from one distinct value
我想用 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>
是否可以提取这些唯一值对?
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
标签,但这很容易足以适应
我想用 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>
是否可以提取这些唯一值对?
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
标签,但这很容易足以适应