2012-04-17 135 views
0

比較我是一個有點新的XSLT,所以我的基本問題道歉。XSL:節點值與另一個節點

我正在嘗試創建一個XSL樣式表,它將從XML(下面)第三個<cell>--即CODE1,CODE2 - 從每個節點中取出並放入下拉框中。我還想比較每個節點並採取任何重複出現的內容,以便它只顯示CODE1和CODE2的一個實例,而不是CODE1,CODE1和CODE2。

XML:

<dvm> 
    <description>This is a description</description> 
    <columns> 
    <column name="lang"/> 
    <column name="text"/> 
    <column name="code" qualifier="true" order="1"/> 
    <column name="comm" qualifier="true" order="2"/> 
    <column name="subj"/> 
    <column name="copy"/> 
    <column name="flag"/> 
</columns> 
<rows> 
    <row> 
    <cell>English</cell> 
    <cell></cell> 
    <cell>CODE1</cell> 
    <cell>Fixed</cell> 
    <cell>Title1</cell> 
    <cell/><cell/> 
    <cell/><cell/> 
    </row> 
    <row> 
    <cell>English</cell> 
    <cell></cell> 
    <cell>CODE1</cell> 
    <cell>Wired</cell> 
    <cell>Title2</cell> 
    <cell/><cell/> 
    <cell/><cell/> 
    </row> 
    <row> 
    <cell>English</cell> 
    <cell></cell> 
    <cell>CODE2</cell> 
    <cell>Fixed</cell> 
    <cell>Title3</cell> 
    <cell/><cell/> 
    <cell/><cell/> 
    </row> 
</dvm> 

回答

0

當你能夠運用XSLT 2.0,然後使用以下命令:

<xsl:value-of select="distinct-values(dvm/rows/row/cell[3])"/> 

在XSLT 1.0,使用Muenchian分組的由邁克爾·凱提及。演示:

<?xml version="1.0" encoding="UTF-8"?> 
<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:key name="Cells" match="dvm/rows/row/cell[3]" use="."/> 
    <xsl:template match="/"> 
     <root> 
      <w> 
       <xsl:for-each select="dvm/rows/row/cell[3]"> 
        <item> 
         <xsl:value-of select="."/> 
        </item> 
       </xsl:for-each> 
      </w> 
      <z> 
       <xsl:for-each select="dvm/rows/row/cell[3]"> 
        <xsl:if test="generate-id() = generate-id(key('Cells', .)[1])"> 
         <item> 
          <xsl:value-of select="."/> 
         </item> 
        </xsl:if> 
       </xsl:for-each> 
      </z> 
     </root> 
    </xsl:template> 
</xsl:stylesheet> 

導致以下結果:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <w> 
     <item>CODE1</item> 
     <item>CODE1</item> 
     <item>CODE2</item> 
    </w> 
    <z> 
     <item>CODE1</item> 
     <item>CODE2</item> 
    </z> 
</root> 

說明:
xsl:key鍵值分配給從match/use值構造節點的每次出現 - 你不妨關注cell[3]值上。然後通過所有這些cell[3]值循環,檢查所述值是否具有唯一的ID(每個節點具有唯一的ID,其可以通過應用generate-id()功能,可以訪問)等於所述第一元件的集合中的節點的具有相同鍵值的ID值(該組通過使用key()函數進行選擇)。實際上,當您將當前節點值應用爲鍵值時,您正在檢查處理的節點是否與Cells鍵定義的節點集中的第一個節點是同一節點。
其實指數[1]是多餘的,因爲當它被冷落,平等與設置反正的第一要素檢查,因爲generate-id(..node-set..)會自動只產生在節點集中的第一個節點的ID,但它是一個有點整齊地添加索引。
請注意,這會導致僅選擇一個CODE1單元格[3]值。
這個實際應用可能是定義一個xsl:variable,其內容與上面的<z>元素的內容相同(因此,xsl:for-each等),然後使用該變量遍歷其中的<item>元素,並在列表中顯示這些元素正在談論。

2

刪除重複是類的通常被稱爲「分組」問題的一個特例。 XSLT 2.0中有幾個功能可以幫助分組問題,distinct-values()函數和xsl:for-each-group指令。在XSLT 1.0是更加困難:搜索「Muenchian分組的」(或等待別人有更多的時間比我要在這裏解釋一下......)

相關問題