顺序转换XSLT

时间:2017-11-20 10:10:05

标签: xml xslt xslt-1.0

我在转型期间遇到了一个问题,需要你的帮助。 我的XML:

<Root>
<ActualXML>
        <Node>  
            <a>a1</a>                               
            <b>b1</b>               
            <ChildNode1>    
                <c>c1</c>                               
                <d>d1</d>       
                <e>e1</e>                                   
            </ChildNode1>   
            <ChildNode2>                    
                <m>m1</m>                                       
                <n>n1</n>                                       
                <o>o1</o>                                               
            </ChildNode2>           
        </Node>
        <Node>              
            <a>a2</a>                               
            <b>b2</b>                       
            <ChildNode1>
                <c>c2</c>
                <d>d2</d>                                           
            </ChildNode1>               
        </Node>
</ActualXML>
<ReferenceXML>
   <Node>
        <a sample="    "/>
        <b sample="        "/>
        <p sample="    "/>
        <q sample="    "/>
   </Node>
   <ChildNode1>
        <c sample="            "/>
        <d sample="        "/>
        <e sample=" "/>
        <f sample=" "/>
   </ChildNode1>
   <ChildNode2>
        <l sample="            "/>
        <m sample="    "/>
        <n sample="    "/>
        <o sample="        "/>
   </ChildNode2>
</ReferenceXML>
</Root>

从这个XML我必须执行两件事:

  1. 根据参考XML格式化实际XML。根据定义的标准参考向字符串长度添加空格。 - 这是实现

  2. 维护Actaul XML for Parent-Child-Parent的序列。

  3. 我当前的输出顺序是:Node-Node-ChildNode1-Childnode-1-Childnode2

    我想要的输出序列是:Node-ChildNode1-Childnode2-Node-ChildNode1

    当前的XSLT:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:param name="replacements" select="Root/ActualXML"/>
      <xsl:template match="/*">
        <Root>
                <xsl:apply-templates/>
        </Root>
      </xsl:template>
        <xsl:template match="/Root/ActualXML">
                <!--xsl:apply-templates select="@*|node()"/-->
        </xsl:template>
        <xsl:template match="ReferenceXML">
                <xsl:apply-templates select="@*|node()"/>
        </xsl:template>
        <xsl:template match="ReferenceXML/*">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="node()">
        <xsl:copy>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="//ReferenceXML/Node">
        <xsl:call-template name="selectsNode">
            <xsl:with-param name="i">1</xsl:with-param>
            <xsl:with-param name="count" select="count(/Root/ActualXML/Node)"/>
        </xsl:call-template>
    </xsl:template>
    <xsl:template name="selectsNode">
        <xsl:param name="i" />
        <xsl:param name="count" />
        <xsl:if test="$i &lt;= $count">
            <Node>
            <xsl:apply-templates select="//ReferenceXML/Node/*" >
                <xsl:with-param name="count" select="$i"/>
            </xsl:apply-templates>
            </Node>
        </xsl:if>
        <xsl:if test="$i &lt;= $count">
            <xsl:call-template name="selectsNode">
                <xsl:with-param name="i">
                    <xsl:value-of select="$i + 1"/>
                </xsl:with-param>
                <xsl:with-param name="count">
                    <xsl:value-of select="$count"/>
                </xsl:with-param>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
    <xsl:template match="//ReferenceXML/Node/*">
        <xsl:param name="count" />
        <xsl:variable name="replacement" 
           select="$replacements/Node[position()=$count]/*[local-name() = local-name(current())]" />
        <xsl:copy>
            <xsl:value-of select="substring(concat($replacement | current()[not($replacement)],@sample),1,string-length(@sample))"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="//ReferenceXML/ChildNode1">
        <xsl:call-template name="selectsChildNode1">
            <xsl:with-param name="i">1</xsl:with-param>
            <xsl:with-param name="count" select="count(/Root/ActualXML/Node/ChildNode1)"></xsl:with-param>
        </xsl:call-template>
    </xsl:template>
    <xsl:template name="selectsChildNode1">
        <xsl:param name="i" />
        <xsl:param name="count" />
        <xsl:if test="$i &lt;= $count">
            <ChildNode1>
            <xsl:apply-templates select="//ReferenceXML/ChildNode1/*" >
                <xsl:with-param name="count" select="$i"/>
            </xsl:apply-templates>
            </ChildNode1>
        </xsl:if>
        <xsl:if test="$i &lt;= $count">
            <xsl:call-template name="selectsChildNode1">
                <xsl:with-param name="i">
                    <xsl:value-of select="$i + 1"/>
                </xsl:with-param>
                <xsl:with-param name="count">
                    <xsl:value-of select="$count"/>
                </xsl:with-param>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>  <xsl:template match="//ReferenceXML/ChildNode1/*">
        <xsl:param name="count" />
        <xsl:variable name="replacement" 
           select="$replacements/Node[position()=$count]/ChildNode1/*[local-name() = local-name(current())]" />
        <xsl:copy>
            <xsl:value-of select="substring(concat($replacement | current()[not($replacement)],@sample),1,string-length(@sample))"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="//ReferenceXML/ChildNode2/*">
        <xsl:variable name="replacement" 
           select="$replacements/Node/ChildNode2/*[local-name() = local-name(current())]" />
        <xsl:copy>
            <xsl:value-of select="substring(concat($replacement | current()[not($replacement)],@sample),1,string-length(@sample))"/>
        </xsl:copy>
    </xsl:template>
    </xsl:stylesheet>
    

    当前o / p xml:

    <Root>
    <ActualXML>
        <Node>  
            <a>a1  </a>                               
            <b>b1      </b>  
            <p>    </p>
            <q>    </q>
        </Node>     
        <Node>              
            <a>a2    </a>                               
            <b>b2      </b> 
            <p>    </p>
            <q>    </q>
        </Node>         
        <ChildNode1>    
                <c>c1          </c>                               
                <d>d1      </d>       
                <e>1</e>     
                <f> </f>
        </ChildNode1>                       
        <ChildNode1>
                <c>c2          </c>
                <d>d2      </d>     
                <e> </e>     
                <f> </f>                                           
        </ChildNode1>  
        <ChildNode2>    
                <l>            </l>
                <m>m1  </m>                                       
                <n>n1  </n>                                       
                <o>o1      </o>                                               
        </ChildNode2>  
    </ActualXML>
    </Root>
    

    所需的o / p xml: 我只在管理序列时需要帮助。

    <Root>
    <ActualXML>
        <Node>  
            <a>a1  </a>                               
            <b>b1      </b>  
            <p>    </p>
            <q>    </q>
        </Node>          
        <ChildNode1>    
                <c>c1          </c>                               
                <d>d1      </d>       
                <e>1</e>     
                <f> </f>
        </ChildNode1>   
        <ChildNode2>    
                <l>            </l>
                <m>m1  </m>                                       
                <n>n1  </n>                                       
                <o>o1      </o>                                               
        </ChildNode2>      
        <Node>              
            <a>a2    </a>                               
            <b>b2      </b> 
            <p>    </p>
            <q>    </q>
        </Node>                      
        <ChildNode1>
                <c>c2          </c>
                <d>d2      </d>     
                <e> </e>     
                <f> </f>                                           
        </ChildNode1>
    </ActualXML>
    </Root>
    

0 个答案:

没有答案