首页 > 解决方案 > 每次选择的 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 只有一次。我的问题是,我不知道将使用哪些 KeyName 以及它们出现的频率。树的结构/深度是恒定的。

目标:

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

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

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

标签: xmlxpath

解决方案


也许它可以帮助其他人。经过一些测试和更多研究,我发现了一个名为“Muenchian grouping”的例程。我尝试了不同的示例,直到找到合适的示例。下面你会找到 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>

推荐阅读