如何组织XML条目 [英] How to organize entries of 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
此外,在此示例中还添加了grp1
,grp2
和grp3
,因此我可以多次添加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屋!