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

Xslt 将元素序列值移动到其他元素序列,xslt,xslt-2.0,Xslt,Xslt 2.0,我有一个特定的需求,其中,我需要根据原始序列中的值的数量将序列元素值移动到另一个新创建的元素。 请查找我的输入XML和所需的输出XML。 非常感谢您的帮助 规则: 将Addr1(catalog/cd11/Location/Addr/Addr1)的值移动到 目录/cd11/位置/主要/原件/地址1/地点。需要创建主/原始/地址1/地点 输入XML: <?xml version="1.0" encoding="UTF-8"?> <root xmlns="http://www.alt

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

规则: 将Addr1(catalog/cd11/Location/Addr/Addr1)的值移动到 目录/cd11/位置/主要/原件/地址1/地点。需要创建主/原始/地址1/地点

输入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>

芝加哥

您可以为
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>

这台变换器运转良好。感谢您提供的解决方案,但是如果没有它,我将如何实现,因为它复制了源名称空间。在我的例子中,源和目标XML文档类型具有不同的名称空间。如何实现呢?在您发布的示例中,我看到输入是
,输出是
。如果不正确,请编辑您的问题,并向我们显示哪些输出元素属于哪个其他名称空间。@Martin,我已根据需要修改了输出XML。非常感谢。更改样式表中的
xmlns=
以使用所需的结果名称空间,然后添加模板
匹配=*
对于主体
我尝试了与您提到的相同的方法,但它总是将旧名称空间复制到模板匹配中的元素。反过来,当它针对目标模式进行验证时,整个元素将被删除。
<?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>
<?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>