Xml XSLT 1.0文本列表到单个元素并删除重复项

Xml XSLT 1.0文本列表到单个元素并删除重复项,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我有以下XML文档: <?xml version="1.0" encoding="UTF-8"?> <cars> <car body="Wagon"> <text>Red</text> </car> <car body="Sedan"> <text>Yellow</text> </car> <car

我有以下XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<cars>
    <car body="Wagon">
        <text>Red</text>
    </car>
    <car body="Sedan">
        <text>Yellow</text>
    </car>
    <car body="Sedan">
        <text></text>
    </car>
    <car body="Wagon">
        <textlist>
            <text>Red</text>
            <text>Green</text>
            <text>Black</text>
            <text>Blue</text>
        </textlist>
    </car>
    <car body="Sedan">
        <textlist>
            <text>Yellow</text>
            <text>Orange</text>
        </textlist>
    </car>
    <car body="Fastback">
        <textlist>
            <text>Yellow</text>
            <text>Red</text>
            <text>Green</text>
            <text>Black</text>
            <text>Blue</text>
        </textlist>
    </car>
    <car body="Fastback">
        <textlist>
            <text>Pink</text>
            <text>Red</text>
            <text>Orange</text>
        </textlist>
    </car>
</cars>
使用XSLT 1.0,我需要将XML文档转换为以下格式:

<?xml version="1.0" encoding="UTF-8"?>
<cars>
    <car type="Wagon">Red</car>
    <car type="Sedan">Yellow</car>
    <car type="Wagon">Green</car>
    <car type="Wagon">Black</car>
    <car type="Wagon">Blue</car>
    <car type="Sedan">Orange</car>
</cars>
请注意:

body=不包括Fastback 复制品不包括在红色货车内 出现两次 文本列表将多个项目作为单个项目放置 输出XML中的元素 忽略空值 以下是一个示例:

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

<xsl:output indent="yes"/>

<xsl:key name="k1" 
  match="car[not(@body = 'Fastback')]//text"
  use="concat(ancestor::car/@body, '|', .)"/>

<xsl:template match="cars">
  <xsl:copy>
    <xsl:apply-templates select="car[not(@body =  'Fastback')]//text
      [generate-id() = generate-id(key('k1', concat(ancestor::car/@body, '|', .))[1])]"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="text">
  <car type="{ancestor::car/@body}">
    <xsl:value-of select="."/>
  </car>
</xsl:template>

</xsl:stylesheet>

它使用Muechian分组,看看您是否不熟悉XSLT 1.0方法。

为了理解这是如何工作的,在键“k1”、concatancestor::car/@body、“|”和[1]末尾的方括号表示什么?[1]选择键组的头部。因此,xsl:apply模板应用于每个组的第一个节点,而不是每个组的每个节点。方括号中的表达式是谓词,带有整数的表达式,例如[1]是位置谓词,是[position=1]的缩写。因此,key'key-name',某个键值表达式选择一个节点集,使用位置谓词key'key-name',某个键值表达式[1],我们只选择key函数调用返回的节点集中文档顺序中的第一个节点。使用完整谓词[generate id=generate-idkey'k1',concatancestor::car/@body,“|”,[1]]确保只处理每个组中的第一项,请参见链接。