使用xpath为每个元素查找不同的子生成元素



我只是不太会使用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,

首先,我建议您使用Muenchian分组来获得不同的值,而不是现在使用的低效方法。

要对每个row执行单独的分组,请在分组密钥中包括row'的唯一id:

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>

请注意,一些XSLT1.0处理器支持EXSLT set:distinct((扩展函数,这使这类事情变得简单多了。

相关内容

  • 没有找到相关文章

最新更新