2014-11-24 55 views
0

我在使用XSLT动态分组时遇到问题。组动态生成的节点集

我的问题很复杂(我认为)部分是因为我试图转换的nodeset是从apache xalan/sql扩展中动态生成的。我严格遵循文档站点上的示例:see link

XSLT项目很大;我只包括以下要点:

<xsl:template match="/"> 
    <!-- I omitted the connection management code --> 
    <xsl:variable name="result" select="sql:query($connection, $query)"/> 
    <xsl:apply-templates select="$result/sql/row-set"/> 
</xsl:template> 

<xsl:template match="row"> 
    <xsl:apply-templates select="col"/> 
</xsl:template> 

<xsl:template match="col"> 
    <xsl:value-of select="text()"/> 
</xsl:template> 

$结果节点集具有这样的结构:

<sql> 
    <row-set> 
     <row> 
      <col column-label='Name'>Bob</col> 
      <col column-label='Site'>Site1</col> 
      <col column-label='Active'>Yes</col> 
     </row> 
     <row> 
      <col column-label='Name'>Sally</col> 
      <col column-label='Site'>Site2</col> 
      <col column-label='Active'>Yes</col> 
     </row> 
     <row> 
      <col column-label='Name'>Sam</col> 
      <col column-label='Site'>Site1</col> 
      <col column-label='Active'>No</col> 
     </row> 
     <row> 
      <col column-label='Name'>Jeff</col> 
      <col column-label='Site'>Site2</col> 
      <col column-label='Active'>Yes</col> 
     </row> 
    </row-set> 
</sql> 

期望的结果:

<sql> 
    <row-set> 
     <site> 
      <site-name>Site1</site-name> 
      <active> 
       <name>Bob</name>       
      </active> 
      <in-active> 
       <name>Sam</name> 
      </in-active> 
     </site> 
     <site> 
      <site-name>Site2</site-name> 
      <active> 
       <name>Sally</name> 
       <name>Jeff</name>       
      </active> 
      <in-active/> 
     </site> 
    </row-set> 
</sql> 

我有困难的时候,尝试组合使用密钥la la muenchian自匹配不允许变量:

<xsl:key name="group-site" match="$result/sql/row-set/" use=?> 
+0

听起来不愉快,但XSL是关于转换结构化的XML文档。从这个角度来看,你的'$ result'节点集几乎没有提供任何有趣的结构来构建。 – xbug 2014-11-24 03:11:33

+0

由于输入XML似乎是直接的SQL数据库输出,因此我建议您至少使用GROUP BY站点,并在XML中反映此结构元素。 – xbug 2014-11-24 03:16:23

+0

@xbug - 我同意XSLT可能不是正确的工具。不幸的是,这是一个遗留项目,我正在扩大。也就是说也有一个源XML文档,但我省略了它。源XML包含构建sql $查询所需的节点。上面显示的我的“期望结果”将与源文档集成以生成新的转换后的XML。 – user2503167 2014-11-24 04:37:47

回答

0

我有困难的时候用钥匙一拉muenchian 因为比赛不允许变量试图组:

你并不需要在使用变量匹配的定义。定义你的关键要素为:

<xsl:key name="row-by-site" match="row" use="col[@column-label='Site']"/> 

您必须在调用键时()函数由查询创建的“文档”的背景下 - 否则它会寻找行的源XML文档中的匹配。