【问题标题】:XSL How to select multiple values from one distinct valueXSL 如何从一个不同的值中选择多个值
【发布时间】:2018-07-13 09:06:15
【问题描述】:

我想用 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 select distinct-values


【解决方案1】:

XML(实际上是 XSLT)区分大小写,因此 XSLT 中 xpath 中的 player 与 XML 中的 PLAYER 不匹配(其他节点类似)。

此外,您的xsl:for-each 正在选择文本节点,因此&lt;xsl:value-of select="model"/&gt; 正在寻找一个子节点,称为该文本节点的model,这显然不存在。

您可以将表达式更改为 &lt;xsl:value-of select="../../MODEL"/&gt;,但最好将键更改为匹配 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>

我不太确定您是否确切想要的结果是什么,因为问题显示 &lt;MODEL&gt;AA&lt;/MODEL&gt;&lt;STYLE&gt;BB&lt;/STYLE&gt; 是想要的结果,但是 XSLT 正在输出 LI 标记,但它很容易适应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2012-07-03
    • 2022-01-17
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 2011-06-01
    相关资源
    最近更新 更多