2016-12-05 173 views
0

我有,我希望下面的XML結構進行排序XSLT - 相較於同級發表排序

<ESTABLISHMENTS> 
    <ESTABLISHMENT> 
     <NAME>A</NAME> 
     <LOCATION> 
      <LOCALITY>A</LOCALITY> 
     </LOCATION> 
     <RATING> 
      <LEVEL>1</LEVEL> 
      <SCORE>50</SCORE> 
     </RATING> 
    </ESTABLISHMENT> 
    <ESTABLISHMENT> 
     <NAME>C</NAME> 
     <LOCATION> 
      <LOCALITY>B</LOCALITY> 
     </LOCATION> 
     <RATING> 
      <LEVEL>2</LEVEL> 
      <SCORE>50</SCORE> 
     </RATING> 
    </ESTABLISHMENT> 
    <ESTABLISHMENT> 
     <NAME>B</NAME> 
     <LOCATION> 
      <LOCALITY>B</LOCALITY> 
     </LOCATION> 
     <RATING> 
      <LEVEL>2</LEVEL> 
      <SCORE>50</SCORE> 
     </RATING> 
    </ESTABLISHMENT> 
</ESTABLISHMENTS> 

我的目標是通過地方先進行排序,然後按等級,然後通過功能評分,最後通過名字。 我設法得到排序使用下面的代碼工作

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes" omit-xml-declaration="no"/> 
    <xsl:key name="establishment-by-locality" match="ESTABLISHMENTS/ESTABLISHMENT/LOCATION" 
     use="LOCALITY"/> 
    <xsl:template match="EXPORT"> 
    <xsl:for-each select="ESTABLISHMENTS/ESTABLISHMENT/LOCATION[count(.| key('establishment-by-locality', LOCALITY)[1]) = 1]"> 
     <xsl:sort select="LOCALITY"/> 
     <xsl:for-each select="key('establishment-by-locality', LOCALITY)"> 
       <xsl:sort select="../RATING/LEVEL" data-type="number" order="descending"/> 
       <xsl:sort select="../RATING/MERIT_SCORE" data-type="number" order="descending"/> 
       <xsl:sort select="../NAME"/> 

       <xsl:apply-templates select="ancestor::ESTABLISHMENT" mode="test"/> 
      </xsl:for-each> 
    </xsl:for-each> 
    </xsl:template> 
    <xsl:template match="node()" mode="test">  
      <hotel>  
      <name> 
      <xsl:value-of select="NAME"/> 
      </name> 
      <town> 
      <xsl:value-of select="LOCATION/LOCALITY"/> 
      </town> 
      <level> 
      <xsl:value-of select="RATING/LEVEL"/> 
      </level> 
      <score> 
      <xsl:value-of select="RATING/MERIT_SCORE"/> 
     </score> 
    </hotel> 
</xsl:template></xsl:stylesheet> 

然而,一旦XML已經整理我想在「地方」價值觀對新程序建立比較,但我的XPath仍然受到限制使用原始樹。不幸的是,我僅限於XSLT 1.0,因爲目標是Adobe InDesign。

任何幫助非常感謝。

EDIT

比較的目的是爲了決定是否插入和附加的元件,即如果所述地點的不同添加一個節頭。

的最終期望的輸出是大致如下

<establishments> 
    <town> 
     <townName>A</townName> 
     <hotel> 
      <name>A</name> 
      <town>A</town> 
      <level>1</level> 
      <score>50</score> 
     </hotel> 
    </town> 
    <town> 
     <townName>B</townName> 
     <hotel> 
      <name>B</name> 
      <town>B</town> 
      <level>2</level> 
      <score>50</score> 
     </hotel> 
     <hotel> 
      <name>C</name> 
      <town>B</town> 
      <level>2</level> 
      <score>50</score> 
     </hotel> 
    </town> 
</establishments> 
+0

比較你究竟是什麼意思?請發佈轉換的預期結果。 –

回答

1

我看到的是不需要這種比較。期望的輸出可以通過應用以下的樣式表到您的示例輸入可以容易地獲得:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="establishment-by-locality" match="ESTABLISHMENT" use="LOCATION/LOCALITY"/> 

<xsl:template match="/ESTABLISHMENTS"> 
    <establishments> 
     <xsl:for-each select="ESTABLISHMENT[count(.| key('establishment-by-locality', LOCATION/LOCALITY)[1]) = 1]"> 
      <xsl:sort select="LOCATION/LOCALITY"/> 
      <town> 
       <townName> 
        <xsl:value-of select="LOCATION/LOCALITY"/> 
       </townName> 
       <xsl:apply-templates select="key('establishment-by-locality', LOCATION/LOCALITY)"> 
        <xsl:sort select="RATING/LEVEL" data-type="number" order="descending"/> 
        <xsl:sort select="RATING/SCORE" data-type="number" order="descending"/> 
        <xsl:sort select="NAME"/> 
       </xsl:apply-templates> 
      </town> 
     </xsl:for-each> 
    </establishments> 
</xsl:template> 

<xsl:template match="ESTABLISHMENT">  
    <hotel>  
     <name> 
      <xsl:value-of select="NAME"/> 
     </name> 
     <town> 
      <xsl:value-of select="LOCATION/LOCALITY"/> 
     </town> 
     <level> 
      <xsl:value-of select="RATING/LEVEL"/> 
     </level> 
     <score> 
      <xsl:value-of select="RATING/SCORE"/> 
     </score> 
    </hotel> 
</xsl:template> 

</xsl:stylesheet> 

:顯然你的實際輸入具有略微不同的結構。你將不得不自己做出調整。