为每个具有xpath的元素找到不同的子元素

问题描述 投票:0回答:1

我只是迷失于使用xsl1.0当数据拆分成多个子子级时,我试图获取每个“行”的不同输出。

提供了此数据源。

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <row>
    <data>
      <a>
        <b>
          <c>
            <Vehicle>
              <ManufacturerName>BM</ManufacturerName>
            </Vehicle>
          </c>
          <c>
            <Vehicle>
              <ManufacturerName>FORD</ManufacturerName>
            </Vehicle>
          </c>
          <c>
            <Vehicle>
              <ManufacturerName>VAUXHALL</ManufacturerName>
            </Vehicle>
          </c>
          <c>
            <Vehicle>
              <ManufacturerName>VAUXHALL</ManufacturerName>
            </Vehicle>
          </c>
        </b>
      </a>
      <a>
        <b>
          <c>
            <Vehicle>
              <ManufacturerName>VAUXHALL</ManufacturerName>
            </Vehicle>
          </c>
          <c>
            <Vehicle>
              <ManufacturerName>ALPHA</ManufacturerName>
            </Vehicle>
          </c>
          <c>
            <Vehicle>
              <ManufacturerName>BRAVO</ManufacturerName>
            </Vehicle>
          </c>
        </b>
      </a>
    </data>
  </row>
  <row>
    <data>
      <a>
        <b>
          <c>
            <Vehicle>
              <ManufacturerName>CHARLIE</ManufacturerName>
            </Vehicle>
          </c>
          <c>
            <Vehicle>
              <ManufacturerName>ALPHA</ManufacturerName>
            </Vehicle>
          </c>
          <c>
            <Vehicle>
              <ManufacturerName>VAUXHALL</ManufacturerName>
            </Vehicle>
          </c>
        </b>
      </a>
      <a>
        <b>
          <c>
            <Vehicle>
              <ManufacturerName>BM</ManufacturerName>
            </Vehicle>
          </c>
          <c>
            <Vehicle>
              <ManufacturerName>ALPHA</ManufacturerName>
            </Vehicle>
          </c>
        </b>
      </a>
    </data>
  </row>
</Root>

我想获得看起来像这样的输出。

BM, FORD, VAUXHALL, ALPHA, BRAVO,
CHARLIE, ALPHA, VAUXHALL, BM,

很抱歉,以前是否有人问过这个问题,但是我无法弄清楚如何为每一行选择不同的值。我当前的结果仅显示第一行中的值,而未显示其他行中的任何重复值。

任何帮助将不胜感激。

当前我的xsl是

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:template match="Root">
  <xsl:apply-templates select="row"/>  

  </xsl:template>

  <xsl:template match="row">
  <xsl:apply-templates select="data/a/b/c/Vehicle[not(ManufacturerName=preceding::Vehicle/ManufacturerName)]"/>  
  <xsl:text>&#xA;</xsl:text>
  </xsl:template>

  <xsl:template match="data/a/b/c/Vehicle">
    <xsl:value-of select="ManufacturerName"/>
    <xsl:text>,</xsl:text>
  </xsl:template>
</xsl:stylesheet>

具有此结果。

BM,FORD,VAUXHALL,ALPHA,BRAVO,
CHARLIE,
xslt xslt-1.0
1个回答
0
投票

首先,我建议您使用Muenchian grouping来获取不同的值,而不是现在使用的效率低下的方法。

要对每个row进行单独的分组,请在分组键中包含row'的唯一标识:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:key name="vehicle" match="Vehicle" use="concat(ManufacturerName, '|', generate-id(ancestor::row))" />

<xsl:template match="/Root">
    <xsl:for-each select="row">
        <xsl:variable name="row-id" select="generate-id()" />
        <!-- unique vahicles in this row -->
        <xsl:for-each select="data/a/b/c/Vehicle[count(. | key('vehicle', concat(ManufacturerName, '|', $row-id))[1]) = 1]">
            <xsl:value-of select="ManufacturerName"/>
            <xsl:text>, </xsl:text>
        </xsl:for-each>
        <xsl:text>&#xA;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

请注意,某些XSLT 1.0处理器支持EXSLT set:distinct()扩展功能,这使这种事情变得更加简单。

© www.soinside.com 2019 - 2024. All rights reserved.