gpt4 book ai didi

xml - 如何从XSL转换中获得唯一值?

转载 作者:行者123 更新时间:2023-12-03 16:06:07 25 4
gpt4 key购买 nike

我有以下XML文件:

<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="cars.xsd">
<manufacture id="1">
<make>Audi</make>
<classification>
<list mid="1">
<type>Sports</type>
</list>
<list mid="2">
<type>Compact</type>
</list>
<list mid="3">
<type>Compact</type>
</list>
</classification>
</manufacture>
<manufacture id="2">
<make>bmw</make>
<classification>
<list mid="1">
<type>Sports</type>
</list>
<list mid="2">
<type>Luxury</type>
</list>
<list mid="3">
<type>Luxury</type>
</list>
</classification>
</manufacture>
</document>


这是我当前的XSL代码:

<?xml version="1.0" encoding="ISO-8859-1"?>

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

<xsl:output doctype-public="-//WAPFORUM//DTD XHTML Mobile 1.0//EN"
doctype-system="http://www.wapforum.org/DTD/xhtml-mobile10.dtd"
method="xml" version="1.0"
omit-xml-declaration="yes"
indent="yes" encoding="UTF-8" media-type="text/html"/>

<xsl:template match="/">
<xsl:element name="html">
<xsl:element name="head">
<xsl:element name="title">Automotives</xsl:element>
</xsl:element>

<xsl:element name="body">
<xsl:element name="ul">
<xsl:attribute name="class">pageitem</xsl:attribute>
<xsl:for-each select="document/manufacture/classification/list">
<xsl:element name="li">
<xsl:attribute name="class">menu</xsl:attribute>
<xsl:element name="p">
<xsl:attribute name="class">name</xsl:attribute>
<xsl:element name="a">
<xsl:value-of select="type"/>
<xsl:element name="br"/>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>


如何在不重复类型的情况下获得以下输出?

Sports
Compact
Luxury


我是XSLT的新手,并且尝试过使用generate-id(),如下所示: Select once from duplicate XML info, display rest, and sort on a field

但这对我不起作用,因为我听不懂generate-id()代码。

最佳答案

您提到了generate-id,因此这意味着您可能已经在这里阅读了Muenchian Grouping,这确实是获取不同值所需要的。当您对类型元素感兴趣时,您就从定义一个键开始,以便根据其值轻松查找此类元素。

<xsl:key name="types" match="type" use="." />


现在,要获取不同的元素,您需要对所有类型元素进行迭代,但是只输出不同的元素。并告诉它们是否与众不同,您可以检查它们是否首先出现在给定值的键中。

这是表达...

<xsl:apply-templates select="//type[generate-id() = generate-id(key('types', .)[1])]" />


但是要分解成它的主要部分...

key('types', .)-返回当前值的所有类型元素

key('types', .)[1]-返回键中的第一个元素

generate-id(key('types', .)[1])-返回该元素的唯一标识符

generate-id() = generate-id(key('types', .)[1])-检查当前元素的唯一标识符是否等于键中第一个元素的唯一标识符。

因此,如果它们匹配,则是第一次出现,并且可以输出。

这是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:key name="types" match="type" use="." />

<xsl:template match="/">
<xsl:apply-templates select="//type[generate-id() = generate-id(key('types', .)[1])]" />
</xsl:template>

<xsl:template match="type">
<xsl:value-of select="concat(., '&#10;')" />
</xsl:template>
</xsl:stylesheet>


当应用于您的XML时,将输出以下内容

Sports
Compact
Luxury

关于xml - 如何从XSL转换中获得唯一值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15578211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com