树XML上的XSLT

时间:2015-06-10 20:18:51

标签: xml xslt

这是我的XML

         <?xml version="1.0" encoding="utf-8"?>
       <Root>
        <Personal>
           <Admin>
              <Code>111</Code>
           </Admin>
           <Report>
              <DataSet>
                <History>
                  <Claim no="1">
                     <Subject>
                        <Name>
                           <First>John</First>
                        </Name>
                     </Subject>
                 </Claim>
                 <Claim no="2">
                     <Subject>
                         <Name>
                            <First>John</First>
                         </Name>
                     </Subject>
                 </Claim>
            </History>
         </DataSet>
    </Report>
 </Personal>
  <Personal>
           <Admin>
              <Code>222</Code>
           </Admin>
           <Report>
              <DataSet>
                <History>
                  <Claim no="1">
                     <Subject>
                        <Name>
                           <First>Don</First>
                        </Name>
                     </Subject>
                 </Claim>
                 <Claim no="2">
                     <Subject>
                         <Name>
                            <First>Don</First>
                         </Name>
                     </Subject>
                 </Claim>
            </History>
         </DataSet>
    </Report>
   </Personal>
  </Root>

这里“个人”部分会重复多次[动态]。

我希望数据为

    John
      Don

单击John数据必须展开为

    John 
          Admin
          Report
            Claim: 1
               Name: John       
            Claim: 2
                Name:John
       Don

我为此创建了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="keyName" match="Personal" use="Report/Dataset/History/Claim/Subject/Name/First" />
       <xsl:template match="Root">
       <ul>
         <xsl:for-each select="Personal[generate-id() = generate-id(key('keyName', Report/Dataset/History/Claim/Subject/Name/First)[1])]" >
         <xsl:sort select="Admin" />
          <li>
      <xsl:value-of select="Report/Dataset/History/Claim" />
      <ul>
        <xsl:for-each select="key('keyName', Report/Dataset/History/Claim/Subject/Name/First)" >
          <li>
            <xsl:value-of select="Name"/>                
          </li>
        </xsl:for-each>
      </ul>
    </li>
  </xsl:for-each>
</ul>
  </xsl:template>
 </xsl:stylesheet>

我没有按预期获得数据..请在这里指导我。

1 个答案:

答案 0 :(得分:0)

您的问题(可能)是由于XML区分大小写。在你的XML中你有这个:

<Report>
    <DataSet>

但是在你的密钥中(当你使用密钥时),你会这样做:

            use =“Report / Dataset / History / Claim / Subject / Name / First”/&gt;

因此,XML具有DataSet,但您的密钥使用Dataset,它们是不同的。你的密钥必须像这样

<xsl:key name="keyName" match="Personal"   
        use="Report/DataSet/History/Claim/Subject/Name/First" />

类似于使用密钥时。

另一个问题是您的xsl:for-each

    <xsl:for-each select="key('keyName', Report/DataSet/History/Claim/Subject/Name/First)" >
      <li>
        <xsl:value-of select=Name"/>                
      </li>
    </xsl:for-each>

您在这里位于Personal元素,因此<xsl:value-of select=Name"/>需要相对于

<xsl:value-of select="Report/DataSet/History/Claim/Subject/Name"/>