2012-04-17 146 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分组的”(或等待别人有更多的时间比我要在这里解释一下......)

相关问题