如何组织XML条目 [英] How to organize entries of XML

查看:82
本文介绍了如何组织XML条目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

XML:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template name="displaySpecNav" match="/">
        <xsl:for-each select="/root">
            <div class="hidOverflow vertAlignT setCenter smallPadBottom">
                <div id="dvExpProvHolder" class="hidOverflow innerDivCenter">
                    <ul class="uSPStyle" id="uSPStyle">
                        <!-- <xsl:sort select="mOrder" /> -->
                        <li class="setRelative">
                            <a class="tfLink clickMe current" title="{grp1/tfLink01}" data-toggle=".tfLink1" href="javascript:void(0);">
                                <xsl:value-of select="grp1/tfLink01" />
                            </a>
                        </li>
                        <li>
                            <a class="tfLink clickMe" title="{grp2/tfLink02}" data-toggle=".tfLink2"  href="javascript:void(0);">
                                <xsl:value-of select="grp2/tfLink02" />
                            </a>
                        </li>
                        <li>
                            <a class="tfLink clickMe" title="{grp3/tfLink03}" data-toggle=".tfLink3" href="javascript:void(0);">
                                <xsl:value-of select="grp3/tfLink03" />
                            </a>
                        </li>
                    </ul>
                </div>
            </div>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <grp1>
        <tfLink01>Link #2</tfLink01>
        <mOrder>2</mOrder>
        <tfText01 />
        <cfSM1>false</cfSM1>
        <tf1SLink01 />
        <tf1SText01 />
        <tf2SLink01 />
        <tf2SText01 />
        <tf3SLink01 />
        <tf3SText01 />
    </grp1>
    <grp2>
        <tfLink02>Link #1</tfLink02>
        <mOrder>1</mOrder>
        <tfText02 />
        <cfSM2>false</cfSM2>
        <tf1SLink02 />
        <tf1SText02 />
        <tf2SLink02 />
        <tf2SText02 />
        <tf3SLink02 />
        <tf3SText02 />
    </grp2>
    <grp3>
        <tfLink03>Link #3</tfLink03>
        <mOrder>3</mOrder>
        <tfText03 />
        <cfSM3>false</cfSM3>
        <tf1SLink03 />
        <tf1SText03 />
        <tf2SLink03 />
        <tf2SText03 />
        <tf3SLink03 />
        <tf3SText03 />
    </grp3>
</root>

居留XML/XSLT显示以下无序列表:

The abode XML/XSLT displays the following unordered list:

Link #2
Link #1
Link #3

如何修改XSLT,所以<xsl:sort select="mOrder" />可以正常工作并显示以下内容:

How can I modify the XSLT, so the <xsl:sort select="mOrder" /> works correctly and displays the following:

Link #1 (although this is the second entry)
Link #2 (although this is the first entry)
Link #3

此外,在此示例中还添加了grp1grp2grp3,因此我可以多次添加mOrder选择,如果我没有该组并且具有以下XML,该怎么办?设置,并希望保持这种方式):

Also, the grp1, grp2, and grp3 was added in this example so I can add the mOrder choice multiple times, what if I dont have the group and have the following XML (my current setup and would like to keep it this way):

<?xml version="1.0" encoding="UTF-8"?>
    <root>
        <tfLink01>Link #2</tfLink01>
        <mOrder1>2</mOrder1>
        <tfText01 />
        <cfSM1>false</cfSM1>
        <tf1SLink01 />
        <tf1SText01 />
        <tf2SLink01 />
        <tf2SText01 />
        <tf3SLink01 />
        <tf3SText01 />

        <tfLink02>Link #1</tfLink02>
        <mOrder2>1</mOrder2>
        <tfText02 />
        <cfSM2>false</cfSM2>
        <tf1SLink02 />
        <tf1SText02 />
        <tf2SLink02 />
        <tf2SText02 />
        <tf3SLink02 />
        <tf3SText02 />

        <tfLink03>Link #3</tfLink03>
        <mOrder3>3</mOrder3>
        <tfText03 />
        <cfSM3>false</cfSM3>
        <tf1SLink03 />
        <tf1SText03 />
        <tf2SLink03 />
        <tf2SText03 />
        <tf3SLink03 />
        <tf3SText03 />
    </root>

我将如何处理这两种XML格式.

How would I handle either XML format.

推荐答案

最好像这样构造XML(为简洁起见,省略未使用的字段):

It is better if you structure your XML like this (omitted unused fields for brevity):

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <grp>
    <tfLink>Link #2</tfLink>
    <mOrder>2</mOrder>
  </grp>
  <grp>
    <tfLink>Link #1</tfLink>
    <mOrder>1</mOrder>
  </grp>
  <grp>
    <tfLink>Link #3</tfLink>
    <mOrder>3</mOrder>
  </grp>
</root>

您的XSLT然后变为:

Your XSLT then becomes:

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

  <xsl:template match="/root">
    <div class="hidOverflow vertAlignT setCenter smallPadBottom">
      <div id="dvExpProvHolder" class="hidOverflow innerDivCenter">
        <ul class="uSPStyle" id="uSPStyle">

          <xsl:for-each select="grp">
            <xsl:sort select="mOrder" />
            <li>
              <a class="tfLink clickMe" title="{tfLink}"  href="javascript:void(0);"
                 data-toggle='collapse' data-target="#{generate-id()}">
                <xsl:value-of select="tfLink" />
              </a>
            </li>
          </xsl:for-each>

        </ul>
      </div>
    </div>
  </xsl:template>
</xsl:stylesheet>

我还修改了data-toggle(我假设它是Bootstrap)以命名应切换的类(例如,以collapse命名),并修改了data-target以使用generate-id(),您应在以下情况下使用生成要操作的内容.

I've also modified the data-toggle (I assume it's Bootstrap) to name the class it should toggle (collapse as an example), and the data-target to use generate-id(), which you should use when generating the content to be acted upon.

从上面得到的XML是这样的:

The XML resulting from the above is this:

<?xml version="1.0"?>
<div class="hidOverflow vertAlignT setCenter smallPadBottom">
  <div id="dvExpProvHolder" class="hidOverflow innerDivCenter">
    <ul class="uSPStyle" id="uSPStyle">
      <li>
        <a class="tfLink clickMe" title="Link #1" data-toggle="collapse" data-target="#idp31396560" href="javascript:void(0);">Link #1</a>
      </li>
      <li>
        <a class="tfLink clickMe" title="Link #2" data-toggle="collapse" data-target="#idp31377232" href="javascript:void(0);">Link #2</a>
      </li>
      <li>
        <a class="tfLink clickMe" title="Link #3" data-toggle="collapse" data-target="#idp31398000" href="javascript:void(0);">Link #3</a>
      </li>
    </ul>
  </div>
</div>

如果需要在xsl:for-each的第一个元素上设置属性,则可以在XSLT中使用它:

If you need to set attributes on the first element in the xsl:for-each, you can use this in the XSLT:

<xsl:for-each ...>
    <xsl:sort .../>
    <li>
      <xsl:if test="position()=1">
        <xsl:attribute name="class">setCurrent</xsl:attribute>
      </xsl:if>

,和<a>相似.

这篇关于如何组织XML条目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆