将元素序列值移动到其他元素序列

时间:2015-12-06 20:15:33

标签: xslt xslt-2.0

我有一定的要求,我需要根据原始序列中的值的数量将序列元素值移动到另一个新创建的元素。 请查找我的输入XML和所需的输出XML。 非常感谢帮助

规则: 将Addr1(catalog / cd11 / Location / Addr / Addr1)的值移动到 目录/ CD11 /位置/主/原厂/地址1 /位。需要创建primary / original / Address1 / place。

输入XML:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.altova.com">
    <publisher>
        <Name id="d123">
            <Place>Chicago</Place>
        </Name
        <catalogue id="d1" >
            <cd11 id="d2">
                <title>Empire Burlesque</title>
                <artist>Bob Dylan</artist>
                <year>1985</year>
                <Location id="d1234">
                    <Addr id="d234">
                        <Addr1 id="d565">catherine Av</Addr1>
                        <Addr2 id="d566">block a</Addr2>
                        <City id="d567">chicago</City>
                    </Addr>
                    <Addr id="d334">
                        <Addr1 id="d665">Illinois st</Addr1>
                        <Addr2 id="d666">block a</Addr2>
                        <City id="d667">chicago</City>
                    </Addr> 
                </Location>             
            </cd11>
        </catalogue>
        <catalogue id="d3" >
            <cd11 id="d4">
                <title>Jurassic World</title>
                <artist>Chris Pratt</artist>
            </cd11>
        </catalogue>    
    </publisher>
</root>

输出XML:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.example.com">
    <publisher>
        <Name id="d123">
            <Place>Chicago</Place>
        </Name>
        <catalogue id="d1">
            <cd11 id="d2">
                <title>Empire Burlesque</title>
                <artist>Bob Dylan</artist>
                <year>1985</year>
                <Location id="d1234">
                    <Addr id="d234">
                        <Addr1 id="d565">catherine Av</Addr1>
                        <Addr2 id="d566">block a</Addr2>
                        <City id="d567">chicago</City>
                    </Addr>
                    <Addr id="d334">
                        <Addr1 id="d665">Illinois st</Addr1>
                        <Addr2 id="d666">block a</Addr2>
                        <City id="d667">chicago</City>
                    </Addr> 
                    <primary>
                      <original>
                        <test>test value</test>
                      <Address1>
                        <place>catherine Av</place>
                      </Address1>
                      <Address1>                      
                        <place>Illinois st</place>
                     </Address1>
                  </original>
                    </primary>
                </Location>             
            </cd11>
        </catalogue>
        <catalogue id="d3">
            <cd11 id="d4">
                <title>Jurassic World</title>
                <artist>Chris Pratt</artist>
            </cd11>
        </catalogue>    
    </publisher>
</root>

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以为插入新元素并转换Location元素的Addr1元素编写模板:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
  xpath-default-namespace="http://www.altova.com" xmlns="http://www.altova.com">

    <xsl:output indent="yes"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="catalogue/cd11/Location">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
            <primary>
                        <original>
                            <Address1>
                                <xsl:apply-templates select="Addr/Addr1" mode="convert"/>
                            </Address1>
                        </original>
                    </primary>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Addr/Addr1" mode="convert">
        <place>
            <xsl:value-of select="."/>
        </place>
    </xsl:template>
</xsl:transform>

http://xsltransform.net/ncdD7mv的在线示例。

根据您的评论和编辑,您不希望复制元素,而是希望将它们转换为新的命名空间,因此您需要更改元素的xsl:copy的所有用法以创建元素相同的本地名称但具有新的命名空间(如果您在XSLT中拥有正确的xmlns="http://www.example.com"并且使用xsl:element name="{local-name()}",那么它将起作用):

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
  xpath-default-namespace="http://www.altova.com" xmlns="http://www.example.com">

    <xsl:output indent="yes"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="catalogue/cd11/Location">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@* | node()"/>
            <primary>
                        <original>
                            <Address1>
                                <xsl:apply-templates select="Addr/Addr1" mode="convert"/>
                            </Address1>
                        </original>
                    </primary>
        </xsl:element>
    </xsl:template>

    <xsl:template match="Addr/Addr1" mode="convert">
        <place>
            <xsl:value-of select="."/>
        </place>
    </xsl:template>
</xsl:transform>