xslt - 使用 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>
</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'
s 唯一 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>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
请注意,一些 XSLT 1.0 处理器支持 EXSLT set:distinct()扩展函数,这使得这种事情变得更加简单。
推荐阅读
- java - 如何为 Zk 上传按钮创建约束
- python - 在 OpenCV 中设置相机分辨率 - 预构建与自定义构建
- c# - View 从屏幕上移除后如何销毁 ViewModel 对象
- javascript - 如何播放压缩视频
- javascript - Ajax 方法在十进制时不命中控制器
- c++ - 在 memcpy 上添加号码
- java - Spring拦截器不拦截来自静态资源的传入HTTP请求
- android - Firebase 数据库中未找到 Glide 文件异常
- hybris - comptel eventlink 和 instantklink 使用哪种编码语言?
- reactjs - 当我控制台记录它时,event.target.value 返回带有语义 UI 的未定义