2012-08-12 22 views
0

ХМL:組寬度

<?xml version="1.0" encoding="utf-8" ?> 
<page> 
<elements> 
<element> 
<data> 
<Styles Name="default"> 
<Style Url="/css.css" Browser="default" Version="default"/> 
</Styles> 
</data> 
</element> 
<element type="Digillect.WB.Web.Elements.Site.SiteStructureElement"> 
<config StartLevel="0" MaxDepth="3" UseItemVisibility="false"> 
<monikers> 
<moniker store="asdasd"/> 
</monikers> 
</config> 
<data ParentPath="/"> 
</data> 
</element> 


<element name="bids"> 
<config> 
<Object Id="1b61995a-6e22-4b09-af5f-9a50cdaa7863"/> 
<Object Id="baa1d3df-0510-4f68-8a41-1b9b22587134"/> 
</config> 
<data> 

<Object Id="id2" Name="Paris"> 
<Property Name="COUNTRY">France</Property> 
<Property Name="WWW" >http://france.fr</Property> 
</Object> 
<Object Id="id1" Name="Lion"> 
<Property Name="COUNTRY">France</Property> 
<Property Name="WWW" >http://france.fr</Property> 
</Object> 
<Object Id="id3" Name="Berlin"> 
<Property Name="COUNTRY">Germany</Property> 
<Property Name="WWW" >http://germany.gr</Property> 
</Object> 

</data> 
</element> 
</elements> 
</page> 

,有必要使該國的選擇按名稱排序,擺脫重複的:

<select> 
<option value="http://germany.gr">Germany</option> 
<option value="france">France</option> 
</select> 

也就是說,如果國家遇到幾次,值=指定id。如果一次,然後指定鏈接

描述分組如下:如果一個國家碰頭幾次,

代碼:

<div id="france"> 
<p> <a href="/index.php?id=id1">Lion</a></p> 
<p><a href="/index.php?id=id2">Paris</a></p> 
</div> 

如果國家舉行一次 - 沒有寫

+0

請編輯問題並添加完整通緝的結果。 – 2012-08-12 13:34:59

回答

0

使用XSLT 1.0可以使用Muechian分組分別執行分組來識別和消除重複;樣式表

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

<xsl:output method="html" indent="yes"/> 

<xsl:key name="k1" match="data/Object" use="@Id"/> 

<xsl:template match="data"> 
    <select> 
    <xsl:apply-templates select="Object[generate-id() = generate-id(key('k1', @Id)[1])]"/> 
    </select> 
    <xsl:apply-templates select="Object[generate-id() = generate-id(key('k1', @Id)[1]) and key('k1', @Id)[2]]" mode="desc"/> 
</xsl:template> 

<xsl:template match="data/Object[key('k1', @Id)[2]]"> 
    <option value="{@Id}"> 
    <xsl:value-of select="Property[@Name = 'COUNTRY']"/> 
    </option> 
</xsl:template> 

<xsl:template match="data/Object[not(key('k1', @Id)[2])]"> 
    <option value="{Property[@Name = 'WWW']}"> 
    <xsl:value-of select="Property[@Name = 'COUNTRY']"/> 
    </option> 
</xsl:template> 

<xsl:template match="data/Object" mode="desc"> 
    <div id="city_{@Id}"> 
    <xsl:apply-templates select="key('k1', @Id)/Property[@Name = 'NAME']" mode="desc"/> 
    </div> 
</xsl:template> 

<xsl:template match="data/Object/Property" mode="desc"> 
    <p> 
    <xsl:value-of select="."/> 
    </p> 
</xsl:template> 

</xsl:stylesheet> 

將輸入

<page> 
<elements> 
<element name="bids"> 
<data> 

<Object Id="id1"> 
<Property Name="NAME" Order="0">Paris</Property> 
<Property Name="COUNTRY">France</Property> 
<Property Name="WWW" >http://france.fr</Property> 
</Object> 
<Object Id="id1"> 
<Property Name="NAME" Order="0">Lion</Property> 
<Property Name="COUNTRY">France</Property> 
<Property Name="WWW" >http://france.fr</Property> 
</Object> 
<Object Id="id2"> 
<Property Name="NAME" Order="0">Berlin</Property> 
<Property Name="COUNTRY">Germany</Property> 
<Property Name="WWW" >http://germany.gr</Property> 
</Object> 

</data> 
</element> 
</elements> 
</page> 

<select> 
    <option value="id1">France</option> 
    <option value="http://germany.gr">Germany</option></select><div id="city_id1"> 
    <p>Paris</p> 
    <p>Lion</p> 
</div> 

[編輯]

下面是一個使用一個不同的密鑰來嘗試執行改變的適於樣式表要求:

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

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

<xsl:key name="k1" match="data/Object" use="Property[@Name = 'COUNTRY']"/> 

<xsl:template match="data[Object]"> 
    <select> 
    <xsl:apply-templates select="Object[generate-id() = generate-id(key('k1', Property[@Name = 'COUNTRY'])[1])]"/> 
    </select> 
    <xsl:apply-templates select="Object[generate-id() = generate-id(key('k1', Property[@Name = 'COUNTRY'])[1]) and key('k1', Property[@Name = 'COUNTRY'])[2]]" mode="desc"/> 
</xsl:template> 

<xsl:template match="data/Object[key('k1', Property[@Name = 'COUNTRY'])[2]]"> 
    <option value="{Property[@Name = 'COUNTRY']}"> 
    <xsl:value-of select="Property[@Name = 'COUNTRY']"/> 
    </option> 
</xsl:template> 

<xsl:template match="data/Object[not(key('k1', Property[@Name = 'COUNTRY'])[2])]"> 
    <option value="{Property[@Name = 'WWW']}"> 
    <xsl:value-of select="Property[@Name = 'COUNTRY']"/> 
    </option> 
</xsl:template> 

<xsl:template match="data/Object" mode="desc"> 
    <div id="{Property[@Name = 'COUNTRY']}"> 
    <xsl:apply-templates select="key('k1', Property[@Name = 'COUNTRY'])" mode="link"> 
     <xsl:sort select="@Name"/> 
    </xsl:apply-templates> 
    </div> 
</xsl:template> 

<xsl:template match="data/Object" mode="link"> 
    <p> 
    <a href="/index.php?id={@Id}"> 
     <xsl:value-of select="@Name"/> 
    </a> 
    </p> 
</xsl:template> 

</xsl:stylesheet> 

當我申請的是樣式表輸入

<?xml version="1.0" encoding="utf-8" ?> 
<page> 
<elements> 
<element> 
<data> 
<Styles Name="default"> 
<Style Url="/css.css" Browser="default" Version="default"/> 
</Styles> 
</data> 
</element> 
<element type="Digillect.WB.Web.Elements.Site.SiteStructureElement"> 
<config StartLevel="0" MaxDepth="3" UseItemVisibility="false"> 
<monikers> 
<moniker store="asdasd"/> 
</monikers> 
</config> 
<data ParentPath="/"> 
</data> 
</element> 


<element name="bids"> 
<config> 
<Object Id="1b61995a-6e22-4b09-af5f-9a50cdaa7863"/> 
<Object Id="baa1d3df-0510-4f68-8a41-1b9b22587134"/> 
</config> 
<data> 

<Object Id="id2" Name="Paris"> 
<Property Name="COUNTRY">France</Property> 
<Property Name="WWW" >http://france.fr</Property> 
</Object> 
<Object Id="id1" Name="Lion"> 
<Property Name="COUNTRY">France</Property> 
<Property Name="WWW" >http://france.fr</Property> 
</Object> 
<Object Id="id3" Name="Berlin"> 
<Property Name="COUNTRY">Germany</Property> 
<Property Name="WWW" >http://germany.gr</Property> 
</Object> 

</data> 
</element> 
</elements> 
</page> 

結果是

<select> 
    <option value="France">France</option> 
    <option value="http://germany.gr">Germany</option></select><div id="France"> 
    <p><a href="/index.php?id=id1">Lion</a></p> 
    <p><a href="/index.php?id=id2">Paris</a></p> 
</div> 

所以option元件分組的要求(雖然我無法弄清楚什麼決定了排序訂單)和p元素包含與@Id值合併的鏈接。

+0

嗯。如果更復雜的XML - 麻煩。我沒有足夠的知識來解決。我把完整版。 – user1593412 2012-08-12 16:45:03

+0

那麼你可以編輯輸入樣本,但是我們還需要知道你想要對其他元素做什麼,所以編輯結果樣本以及解釋你想要的結果。 – 2012-08-12 16:58:29

+0

我糾正了XML和HTML。隨處可見身份標識不同,並且該組將在國家/地區 – user1593412 2012-08-12 18:18:10

0

這種轉變

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:key name="kObjByCountry" match="Object" use="Property[@Name='COUNTRY']"/> 

<xsl:template match="/"> 
    <xsl:variable name="vCountries" select= 
    "/*/*/*/data/Object 
      [generate-id() 
      = generate-id(key('kObjByCountry', Property[@Name='COUNTRY'])[1]) 
      ]"/> 
    <select> 
    <xsl:apply-templates select="$vCountries"> 
     <xsl:sort select="Property[@Name='COUNTRY']"/> 
    </xsl:apply-templates> 
    </select> 

    <xsl:apply-templates select="$vCountries" mode="desc"> 
     <xsl:sort select="Property[@Name='COUNTRY']"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="Object"> 
    <xsl:variable name="v2nd" 
     select="key('kObjByCountry', Property[@Name='COUNTRY'])[2]"/> 
    <option value="{(@Id[$v2nd]|Property[@Name='WWW'])[1]}"> 
    <xsl:value-of select="Property[@Name='COUNTRY']"/> 
    </option> 
</xsl:template> 

<xsl:template mode="desc" 
    match="Object[key('kObjByCountry', Property[@Name='COUNTRY'])[2]]"> 
    <div id="sity_{@Id}"> 
    <xsl:apply-templates select= 
     "key('kObjByCountry', Property[@Name='COUNTRY']) 
            /Property[@Name='NAME']"> 
     <xsl:sort/> 
     </xsl:apply-templates> 
    </div> 
</xsl:template> 

<xsl:template match="Property[@Name='NAME']"> 
    <p><xsl:value-of select="."/></p> 
</xsl:template> 

    <xsl:template mode="desc" 
    match="Object[not(key('kObjByCountry', Property[@Name='COUNTRY'])[2])]"/> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<page> 
    <elements> 
     <element name="bids"> 
      <data> 
       <Object Id="id1"> 
        <Property Name="NAME" Order="0">Paris</Property> 
        <Property Name="COUNTRY">France</Property> 
        <Property Name="WWW" >http://france.fr</Property> 
       </Object> 
       <Object Id="id1"> 
        <Property Name="NAME" Order="0">Lion</Property> 
        <Property Name="COUNTRY">France</Property> 
        <Property Name="WWW" >http://france.fr</Property> 
       </Object> 
       <Object Id="id2"> 
        <Property Name="NAME" Order="0">Berlin</Property> 
        <Property Name="COUNTRY">Germany</Property> 
        <Property Name="WWW" >http://germany.gr</Property> 
       </Object> 
      </data> 
     </element> 
    </elements> 
</page> 

產生想要的,正確的結果 - 在該國家/城市進行排序

<select> 
    <option value="id1">France</option> 
    <option value="http://germany.gr">Germany</option> 
</select> 
<div id="sity_id1"> 
    <p>Lion</p> 
    <p>Paris</p> 
</div> 

說明

正確使用的Muenchian grouping methodAVT秒。

正確使用xsl:sort