我有以下 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在这里,这确实是您获得不同值所需的。由于您对 type 元素感兴趣,因此您可以从我定义一个键开始,以便通过其值轻松查找此类元素。
<xsl:key name="types" match="type" use="." />
现在,要获取不同的元素,您可以迭代所有 type 元素,但只输出不同的元素。为了告诉它们是不同的,您检查它们是否首先出现在给定值的键中。
这是表达式...
<xsl:apply-templates select="//type[generate-id() = generate-id(key('types', .)[1])]" />
但是要将其分解为其组成部分......
key('types', .)
- 返回当前值的所有 type 元素
key('types', .)[1]
- 返回键中的第一个元素
generate-id(key('types', .)[1])
- 返回该元素的唯一标识符
generate-id() =generate-id(key('types', .)[1])
- 检查当前元素的唯一标识符是否等于第一个元素的唯一标识符在 key 里。
因此,如果它们匹配,则它是第一次出现,并且可以输出。
这是完整的 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(., ' ')" />
</xsl:template>
</xsl:stylesheet>
当应用于您的 XML 时,输出以下内容
Sports
Compact
Luxury
关于xml - 如何从 XSL 转换中获得独特的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15578211/