xml - 如何从 XSL 转换中获得独特的值?

标签 xml xpath xslt

我有以下 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(., '&#10;')" />
   </xsl:template>
</xsl:stylesheet>

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

Sports
Compact
Luxury

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

相关文章:

java - 如何使用Jre默认处理器(JAXPSAXProcessor)获取XPath中的元素<and>和<or>

xml - 如何获取单个 XML 元素的所有 namespace 声明

c# - 如何从 Xelement 中获取根元素

java - Xpath - 通过通配符或 boolean 操作查找以相同名称开头的节点?

xml - 如何转换 XML 文档具有命名空间的 xsl

php - XSLT:通过变量值选择一个元素

variables - 如何使用变量选择路径?

xml - scala.Predef 中 $scope 的用途是什么?

xml - 根据xml标签内容重命名文件

xpath - 使用xpath进行节点比较