Xpath for-each selection

时间:2018-05-03 17:06:34

标签: xml xpath

我有一个以下结构的XML文件

    <root>
      <Row>
         <KeyName>A</KeyName>
         .....
      </Row>
      <Row>
         <KeyName>B</KeyName>
         .....
      </Row>
      <Row>
         <KeyName>A</KeyName>
         .....
      </Row>
      <Row>
         <KeyName>B</KeyName>
         .....
      </Row>
      <Row>
         <KeyName>C</KeyName>
         .....
      </Row>
   </root>

我想为xml-fo转换发表声明

我需要在所有KeyNames上循环,但每个KeyName只需一次。我的问题是,我不知道将使用哪些KeyNames以及它们出现的频率。树的结构/深度是恒定的。

目标:

    Block KeyName/text()=A
     Row data
     Row data
     Row data 
     ..

    Block KeyName/text()=B
     Row data
     Row data
     ..

继续使用所有现有(但未知)的KeyNames。

1 个答案:

答案 0 :(得分:0)

也许它可以帮助其他人。 经过一些测试和更多的研究,我找到了一个名为&#34; Muenchian grouping&#34;的例行程序。我尝试了不同的例子,直到找到合适的例子。 下面你将找到xslt转换文件的代码,它引用了我的问题的数据。

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" />

<xsl:key name="RowbyKeyName" match="Row" use="KeyName" />

<xsl:template match="root"> 
   <ul>
     <xsl:for-each select="Row[generate-id() = generate-id(key('RowbyKeyName', KeyName)[1])]" >
        <li> 
             KeyName: <xsl:value-of select="KeyName" /> 
             <ul> 
                      <xsl:for-each select="key('RowbyKeyName', KeyName)" >
                         <li>  
                             <xsl:value-of select="..." /> 
                             ....
                             Row Data
                             ....
                         </li>
                      </xsl:for-each> 
             </ul>
       </li> 
     </xsl:for-each> 
   </ul> 
</xsl:template>
</xsl:stylesheet>