Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT:如何用所有同级的串联替换第一个同级?_Xml_Xslt_Xml Parsing_Xslt 1.0_Xslt 2.0 - Fatal编程技术网

Xml XSLT:如何用所有同级的串联替换第一个同级?

Xml XSLT:如何用所有同级的串联替换第一个同级?,xml,xslt,xml-parsing,xslt-1.0,xslt-2.0,Xml,Xslt,Xml Parsing,Xslt 1.0,Xslt 2.0,我很难实现XSL转换 我需要改变这一点: <records> <item> <id type="uid">1</id> <name>Homepage</name> <attr>AB308E</attr> </item> <item> <id type="u

我很难实现XSL转换

我需要改变这一点:

<records>
    <item>
        <id type="uid">1</id>
        <name>Homepage</name>
        <attr>AB308E</attr>
    </item>
    <item>
        <id type="uid">5</id>
        <name>Electronics</name>
        <attr>F04550</attr>
    </item>
    <item>
        <id type="uid">8</id>
        <name>Accessories</name>
        <attr>00EE80</attr>
    </item>
</records>

1.
主页
AB308E
5.
数码产品
F04550
8.
配件
00EE80
为此:

<records>
    <item>
        <id type="uid">1</id>
        <category>Homepage - Electronics - Accessories</category>
        <attr>AB308E</attr>
    </item>
    <item>
        <id type="uid">5</id>
        <name>Electronics</name>
        <attr>F04550</attr>
    </item>
    <item>
        <id type="uid">8</id>
        <name>Accessories</name>
        <attr>00EE80</attr>
    </item>
</records>

1.
主页-电子产品-配件
AB308E
5.
数码产品
F04550
8.
配件
00EE80
我知道从语义上讲它没有多大意义,但为了以特定的方式将数据注入到某个接口中,我需要使用这种方法

规则#1:每个
记录的第一个
标记的
名称
标记(实际文件中有许多记录)变成
类别
,并包含当前
记录
范围中所有项的名称的串联

规则#2:
不是
记录
的第一个子项的标记将保持不变

我尝试使用
规则,但没有成功


有人知道如何实现这一点吗?

使用身份转换作为基本模板并添加一个模板

  <xsl:template match="records/item[1]/name">
      <category>
          <xsl:value-of select="., ../following-sibling::item/name" separator=" - "/>
      </category>
  </xsl:template>

试试这个:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="records/item[1]/name">
        <category>        
            <xsl:for-each select="../../item/name">
                <xsl:value-of select="." />
                <xsl:if test="position() != last()">
                    <xsl:value-of select="' - '" />
                </xsl:if>
            </xsl:for-each>
        </category>
    </xsl:template>
</xsl:stylesheet>

使用