xsl如何将节点拆分为多个

时间:2015-11-05 14:17:56

标签: xml xslt split

我是XSL的新手,我需要一些细节来实现这个过程。 我想用xsl实现一个模板来获取父节点上的多个输出,你能不能帮我。

This is the input required now :

<parent>
<company>
<liv dt="2015-10-22" >
<Qty type ="NET"> 55</Qty> 
<Qty type ="FAR"> 558</Qty>
<Qty type ="MAE"> 1222</Qty>
<HR amt ="NET"> 55</HR> 
<Risk> adsm </Risk>
</liv>

<company>
</parent>

this is the output desired:I need to seprate the companies by Type, the other records should always appear as they were, Thanks a lot for the help:

<parent>

<company>
<liv dt="2015-10-22" ><Qty type ="NET"> 55</Qty> 
<HR amt ="NET"> 55</HR> 
<Risk> adsm </Risk>  
</liv>
</company>

<company>
<liv dt="2015-11-1" ><Qty type ="FAR"> 558</Qty> 
<HR amt ="NET"> 55</HR> 
<Risk> adsm </Risk>
</liv>
</company>

<company>
<liv dt="2015-10-28" ><Qty type ="MAE"> 1222</Qty>
<HR amt ="NET"> 55</HR> 
<Risk> adsm </Risk>
</liv>
</company>

</parent>

1 个答案:

答案 0 :(得分:0)

为处理子项的company元素编写模板,然后在liv的模板中为父项包装:

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

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

    <xsl:template match="company">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="liv">
        <xsl:element name="{name(..)}">
            <xsl:copy-of select="."/>
        </xsl:element>
    </xsl:template>
</xsl:transform>

http://xsltransform.net/3NJ38YT在线。

对于编辑的输入和输出示例,需要更多代码,这里是XSLT:

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

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

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

    <xsl:template match="@*|node()" name="identity" mode="sub">
        <xsl:param name="anchor"/>
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" mode="sub">
                <xsl:with-param name="anchor" select="$anchor"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="company">
        <xsl:apply-templates select="liv/Qty" mode="split"/>
    </xsl:template>

    <xsl:template match="Qty" mode="split">
        <xsl:apply-templates select="ancestor::company" mode="sub">
            <xsl:with-param name="anchor" select="current()"/>
        </xsl:apply-templates>
    </xsl:template>

    <xsl:template match="Qty" mode="sub">
        <xsl:param name="anchor"/>
        <xsl:if test="generate-id() = generate-id($anchor)">
            <xsl:call-template name="identity"/>
        </xsl:if>
    </xsl:template>
</xsl:transform>

http://xsltransform.net/3NJ38YT/1在线。