在Matlab中编写可在Graphpad Prism中打开的xmldoc

时间:2018-07-25 20:46:53

标签: xml matlab xml-parsing static-analysis

我在Matlab中进行了许多计算,并且厌倦了将所有不同的表格剪切并粘贴到Graphpad Prism中的方法,这是我需要的最终格式。我想自动生成可以通过以下方式打开的文件: Graphpad,但我对如何执行此操作有些困惑。我知道我可以在Graphpad和Matlab中导入和导出XML文件,因此我正在练习创建模板。我在Graphpad中制作了一组模拟的数据文件,其中的XML文件如下所示:

<dir>
    <xsl:for-each select="ps:Info">
        <li>
            <a>
                <xsl:attribute name="href">
                    #<xsl:value-of select="@ID"/>
                </xsl:attribute>
                <xsl:apply-templates select="ps:Title"/>
            </a>
        </li>
    </xsl:for-each>
    <xsl:for-each select="ps:Table|ps:HugeTable">
        <li>
            <a>
                <xsl:attribute name="href">
                    #<xsl:value-of select="@ID"/>
                </xsl:attribute>
                <xsl:apply-templates select="ps:Title"/>
            </a>
            <dir>
                <xsl:for-each select="ps:Info">
                    <li>
                        <a>
                            <xsl:attribute name="href">
                                #<xsl:value-of select="@ID"/>
                            </xsl:attribute>
                            <xsl:apply-templates select="ps:Title"/>
                        </a>
                    </li>
                </xsl:for-each>
            </dir>
        </li>
    </xsl:for-each>
</dir>
<hr/>
<xsl:apply-templates select="ps:Info"/>
<br/>
<hr/>
<br/>
<xsl:for-each select="ps:Table|ps:HugeTable">
    <xsl:apply-templates select="ps:Title"/>
    <a>
        <xsl:attribute name="name">
            <xsl:value-of select="@ID"/>
        </xsl:attribute>
    </a>
    <xsl:variable name="width" select="100 div count (*/ps:Subcolumn)"/>
    <xsl:variable name="xFormat" select="./@XFormat"/>
    <xsl:variable name="yFormat" select="./@YFormat"/>
    <xsl:variable name="nRepl" select="./@replicates"/>
    <xsl:variable name="isXAdvancedColumn" select="boolean(($xFormat='date' or $xFormat='time' or $xFormat='startenddate') and count(ps:XAdvancedColumn) &gt; 0)"/>
    <xsl:variable name="isXAdvancedSubcol" select="boolean(($xFormat='startenddate') or count(ps:XAdvancedColumn/ps:Subcolumn/ps:Title) &gt; 0)"/>
    <xsl:variable name="isXSubcol" select="boolean(($xFormat='error' or count(ps:XColumn/ps:Subcolumn/ps:Title) &gt; 0) and not ($isXAdvancedColumn))"/>
    <xsl:variable name="isYSubcol" select="boolean(($yFormat='replicates'and ./@Replicates&gt;1) or 
                         ($yFormat!='text'and $yFormat!='replicates') or 
                        count(ps:YColumn/ps:Subcolumn/ps:Title)&gt;0)"/>
    <xsl:variable name="isYSubColNameCustom" select="boolean($isYSubcol and count(ps:SubColumnTitles)&gt;0)"/>
    <TABLE BORDER="1" CELLSPACING="0">
        <TR>
            <xsl:for-each select="ps:RowTitlesColumn">
                <TD align="center">
                    <xsl:attribute name="rowspan">
                        <xsl:if test="$isXSubcol or $isXAdvancedSubcol or $isYSubcol">2</xsl:if>
                    </xsl:attribute>
                    <BR/>
                </TD>
            </xsl:for-each>
            <xsl:if test="not ($isXAdvancedColumn)">
                <xsl:for-each select="ps:XColumn">
                    <TD align="center">
                        <xsl:attribute name="rowspan">
                            <xsl:if test="$isYSubcol and not($isXSubcol)">2</xsl:if>
                        </xsl:attribute>
                        <xsl:attribute name="colspan">
                            <xsl:value-of select="./@Subcolumns"/>
                        </xsl:attribute>

                        <xsl:apply-templates select="ps:Title"/>
                        <xsl:if test="count(ps:Title)=0 or ps:Title=''">X-Title</xsl:if>


                    </TD>
                </xsl:for-each>
            </xsl:if>
            <xsl:if test="$isXAdvancedColumn">
                <xsl:for-each select="ps:XAdvancedColumn">
                    <TD align="center">
                        <xsl:attribute name="rowspan">
                            <xsl:if test="$isYSubcol and not($isXAdvancedSubcol)">2</xsl:if>
                        </xsl:attribute>
                        <xsl:attribute name="colspan">
                            <xsl:value-of select="./@Subcolumns"/>
                        </xsl:attribute>

                        <xsl:apply-templates select="ps:Title"/>
                        <xsl:if test="count(ps:Title)=0 or ps:Title=''">X-Title</xsl:if>


                    </TD>
                </xsl:for-each>
            </xsl:if>
            <xsl:for-each select="ps:YColumn">
                <xsl:variable name="DefColName2" select="(position()-1) mod 26"/>
                <xsl:variable name="DefColName1" select="(position()-1-$DefColName2) div 26"/>
                <TD align="center">
                    <xsl:attribute name="colspan">
                        <xsl:value-of select="./@Subcolumns"/>
                    </xsl:attribute>
                    <xsl:attribute name="rowspan">
                        <xsl:if test="($isXSubcol or $isXAdvancedSubcol) and not($isYSubcol)">2</xsl:if>
                    </xsl:attribute>

                    <xsl:apply-templates select="ps:Title"/>
                    <xsl:if test="count(ps:Title)=0 or ps:Title=''">
                        <xsl:value-of select="'Data Set-'"/>
                        <xsl:if test="$DefColName1 &gt; 0">
                            <xsl:value-of select="substring($Chars,$DefColName1,1)"/>
                        </xsl:if>
                        <xsl:value-of select="substring($Chars,$DefColName2+1,1)"/>
                    </xsl:if>

                </TD>
            </xsl:for-each>
        </TR>
        <xsl:if test="$isXSubcol or $isXAdvancedSubcol or $isYSubcol">
            <TR>
                <xsl:if test="$isXSubcol">
                    <xsl:for-each select="ps:XColumn">
                        <xsl:for-each select="ps:Subcolumn">
                            <TD align="center"> 

                                <xsl:apply-templates select="ps:Title"/>
                                <xsl:if test="count(ps:Title)=0 or ps:Title=''">
                                    <xsl:choose>
                                        <xsl:when test="position()=1">
                                            <B>X</B>
                                        </xsl:when>
                                        <xsl:when test="position()=2">
                                            <B>Err.Bar</B>
                                        </xsl:when>
                                    </xsl:choose>
                                </xsl:if>


                            </TD>
                        </xsl:for-each>
                    </xsl:for-each>
                </xsl:if>
                <xsl:if test="$isXAdvancedSubcol">
                    <xsl:for-each select="ps:XAdvancedColumn">
                        <xsl:for-each select="ps:Subcolumn">
                            <TD align="center"> 

                                <xsl:apply-templates select="ps:Title"/>
                                <xsl:if test="count(ps:Title)=0 or ps:Title=''">
                                    <xsl:choose>
                                        <xsl:when test="position()=1">
                                            <B>Starting Date</B>
                                        </xsl:when>
                                        <xsl:when test="position()=2">
                                            <B>Ending Date</B>
                                        </xsl:when>
                                    </xsl:choose>
                                </xsl:if>


                            </TD>
                        </xsl:for-each>
                    </xsl:for-each>
                </xsl:if>
                <xsl:if test="$isYSubcol">
                    <xsl:for-each select="ps:YColumn">
                        <xsl:variable name="DefColName2" select="(position()-1) mod 26"/>
                        <xsl:variable name="DefColName1" select="(position()-1-$DefColName2) div 26"/>
                        <xsl:variable name="YColumnNdx" select="position()"/>
                        <xsl:for-each select="ps:Subcolumn">
                            <TD align="center">

                                <xsl:apply-templates select="ps:Title"/>
                                <xsl:if test="count(ps:Title)=0 or ps:Title=''">
                                    <xsl:if test="$yFormat='replicates' or $yFormat='text'">
                                        <B>
                                            <xsl:if test="$DefColName1 &gt; 0">
                                                <xsl:value-of select="substring($Chars,$DefColName1,1)"/>
                                            </xsl:if>
                                            <xsl:choose>
                                                <xsl:when test="$isYSubColNameCustom">
                                                    <xsl:variable name="subColCustomNamePos" select="position()"/>
                                                    <xsl:for-each select="../../ps:SubColumnTitles/ps:Subcolumn">
                                                        <xsl:if test="position()=$subColCustomNamePos">
                                                            <xsl:choose>
                                                                <xsl:when test="../../ps:SubColumnTitles/@OwnSet='1'">
                                                                    <xsl:variable name="DItemsCount" select="count(./ps:d)"/>
                                                                    <xsl:choose>
                                                                        <xsl:when test="$DItemsCount&lt;$YColumnNdx or ./ps:d[$YColumnNdx]=''">
                                                                            <xsl:value-of select="substring($Chars,$DefColName2+1,1)"/>
                                                                            :Y<xsl:value-of select="position()"/>
                                                                        </xsl:when>
                                                                        <xsl:otherwise>
                                                                            <xsl:apply-templates select="./ps:d[$YColumnNdx]"/>
                                                                        </xsl:otherwise>
                                                                    </xsl:choose>
                                                                </xsl:when>
                                                                <xsl:when test="../../ps:SubColumnTitles/@OwnSet='0'">
                                                                    <xsl:variable name="DItemsCount" select="count(./ps:d)"/>
                                                                    <xsl:choose>
                                                                        <xsl:when test="$DItemsCount&lt;1 or ./ps:d[1]=''">
                                                                            <xsl:value-of select="substring($Chars,$DefColName2+1,1)"/>
                                                                            :Y<xsl:value-of select="position()"/>
                                                                        </xsl:when>
                                                                        <xsl:otherwise>
                                                                            <xsl:apply-templates select="./ps:d[1]"/>
                                                                        </xsl:otherwise>
                                                                    </xsl:choose>
                                                                </xsl:when>
                                                                <xsl:otherwise>
                                                                    <xsl:apply-templates select="ps:d"/>
                                                                    <xsl:if test="ps:d=''">
                                                                        <xsl:value-of select="substring($Chars,$DefColName2+1,1)"/>
                                                                        :Y<xsl:value-of select="position()"/>
                                                                    </xsl:if>
                                                                </xsl:otherwise>
                                                            </xsl:choose>
                                                        </xsl:if>
                                                    </xsl:for-each>
                                                </xsl:when>
                                                <xsl:otherwise>
                                                    <xsl:value-of select="substring($Chars,$DefColName2+1,1)"/>
                                                    :Y<xsl:value-of select="position()"/>
                                                </xsl:otherwise>
                                            </xsl:choose>
                                        </B>
                                    </xsl:if>
                                    <xsl:if test="$yFormat!='replicates' and $yFormat!='text'">
                                        <xsl:if test="not($yFormat='replicates' or $yFormat='text')">
                                            <xsl:if test="position()=1">
                                                <B>Mean</B>
                                            </xsl:if>
                                            <xsl:if test="position()!=1">
                                                <xsl:choose>
                                                    <xsl:when test="$yFormat='SD'">
                                                        <B>SD</B>
                                                    </xsl:when>
                                                    <xsl:when test="$yFormat='SE'">
                                                        <B>SEM</B>
                                                    </xsl:when>
                                                    <xsl:when test="$yFormat='CV'">
                                                        <B>%CV</B>
                                                    </xsl:when>
                                                    <xsl:when test="$yFormat='SDN'">
                                                        <xsl:if test="position()=2">
                                                            <B>SD</B>
                                                        </xsl:if>
                                                        <xsl:if test="position()=3">
                                                            <B>N</B>
                                                        </xsl:if>
                                                    </xsl:when>
                                                    <xsl:when test="$yFormat='SEN'">
                                                        <xsl:if test="position()=2">
                                                            <B>SEM</B>
                                                        </xsl:if>
                                                        <xsl:if test="position()=3">
                                                            <B>N</B>
                                                        </xsl:if>
                                                    </xsl:when>
                                                    <xsl:when test="$yFormat='CVN'">
                                                        <xsl:if test="position()=2">
                                                            <B>%CV</B>
                                                        </xsl:if>
                                                        <xsl:if test="position()=3">
                                                            <B>N</B>
                                                        </xsl:if>
                                                    </xsl:when>
                                                    <xsl:when test="$yFormat='low-high'">
                                                        <xsl:if test="position()=2">
                                                            <B>+Error</B>
                                                        </xsl:if>
                                                        <xsl:if test="position()=3">
                                                            <B>-Error</B>
                                                        </xsl:if>
                                                    </xsl:when>
                                                    <xsl:when test="$yFormat='upper-lower-limits'">
                                                        <xsl:if test="position()=2">
                                                            <B>UpperLimit</B>
                                                        </xsl:if>
                                                        <xsl:if test="position()=3">
                                                            <B>LowerLimit</B>
                                                        </xsl:if>
                                                    </xsl:when>
                                                </xsl:choose>
                                            </xsl:if>
                                        </xsl:if>
                                    </xsl:if>
                                </xsl:if>

                            </TD>
                        </xsl:for-each>
                    </xsl:for-each>
                </xsl:if>
            </TR>
        </xsl:if>
        <TR>
            <xsl:for-each select="ps:RowTitlesColumn/ps:Subcolumn">
                <td valign="top" nowrap="1">
                    <xsl:attribute name="width">
                        <xsl:value-of select="$width"/>
                    %</xsl:attribute>
                    <xsl:apply-templates select="ps:d"/>
                    <xsl:if test="count(ps:d)=0">
                        <br/>
                    </xsl:if>
                </td>
            </xsl:for-each>
            <xsl:if test="not($isXAdvancedColumn)">
                <xsl:for-each select="ps:XColumn/ps:Subcolumn">
                    <td valign="top" nowrap="1">
                        <xsl:attribute name="width">
                            <xsl:value-of select="$width"/>
                        %</xsl:attribute>
                        <xsl:apply-templates select="ps:d"/>
                        <xsl:if test="count(ps:d)=0">
                            <br/>
                        </xsl:if>
                    </td>
                </xsl:for-each>
            </xsl:if>
            <xsl:if test="$isXAdvancedColumn">
                <xsl:for-each select="ps:XAdvancedColumn/ps:Subcolumn">
                    <td valign="top" nowrap="1">
                        <xsl:attribute name="width">
                            <xsl:value-of select="$width"/>
                        %</xsl:attribute>
                        <xsl:apply-templates select="ps:d"/>
                        <xsl:if test="count(ps:d)=0">
                            <br/>
                        </xsl:if>
                    </td>
                </xsl:for-each>
            </xsl:if>
            <xsl:for-each select="ps:YColumn/ps:Subcolumn">
                <td valign="top" nowrap="1">
                    <xsl:attribute name="width">
                        <xsl:value-of select="$width"/>
                    %</xsl:attribute>
                    <xsl:apply-templates select="ps:d"/>
                    <xsl:if test="count(ps:d)=0">
                        <br/>
                    </xsl:if>
                </td>
            </xsl:for-each>
        </TR>
    </TABLE>
    <br/>
    <xsl:apply-templates select="ps:Info"/>
    <br/>
    <hr/>
    <br/>
</xsl:for-each>
</BODY>
</HTML>
</xsl:template>
<!--<xsl:template match="ps:d">
    <xsl:choose>
        <xsl:when test="@Excluded and string-length(text())" >
            <font color="#0000ee">
                <xsl:apply-templates select="node()"/>*     
            </font>
        </xsl:when>
        <xsl:otherwise>
            <xsl:apply-templates select="node()"/>
        </xsl:otherwise>
    </xsl:choose>
    <xsl:if test="position()!=last()"><br/></xsl:if>
</xsl:template>-->
<xsl:template match="ps:d">
<xsl:choose>
<xsl:when test="@Excluded and string-length(text())">
<xsl:choose>
    <xsl:when test="../../../@EVFormat='AsteriskAfterNumber'">
        <font color="#0000ee">
            <xsl:apply-templates select="node()"/>
            *
        </font>
    </xsl:when>
    <xsl:when test="../../../@EVFormat='Blank'">
    </xsl:when>
    <xsl:otherwise>
        <xsl:apply-templates select="node()"/>
    </xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="node()"/>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="position()!=last()">
<br/>
</xsl:if>
</xsl:template>
<xsl:template match="ps:Title">
<b>
<xsl:apply-templates select="node()"/>
</b>
</xsl:template>
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ps:Font">
<font>
<xsl:if test="@Size">
<xsl:attribute name="STYLE">
    font-size:<xsl:value-of select="@Size"/>
pt</xsl:attribute>
</xsl:if>
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="node()"/>
</font>
</xsl:template>
<xsl:template match="/">
<HTML>
<BODY>
<xsl:apply-templates select="//ps:GraphPadPrismFile"/>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>

我在想,也许最直接的方法是解析它并更改我需要更改的数据。但是,如果我需要添加更多表(并且需要这样做),这可能会很棘手。有谁知道我如何使用Matlab的xmlread函数来做到这一点?我也尝试过将其作为结构导入,并使用java转换器,但仍然遇到问题。

0 个答案:

没有答案