2010-08-11 44 views
1

我有两个问题与下面的代码,我需要帮助修复:需要帮助固定XSLT文档

1)从XPath表达式返回结果时它不包括根节点。 (我已经尝试了几件事情,但它更加混乱的结果..)

2)我需要帮助修复结果的格式。我需要在同一个标​​题下列出具有相同属性的相同节点,而不是为每个结果标题。我之前有一个similar question,但现在代码的问题已修复,我似乎无法让我的标题正常工作而不会影响结果。

除了缺少根节点的问题,我相信这会返回正确的结果,因此我不想大幅改变代码。

下面是一些有意不一致虚拟XML我与测试:

<pets name="myPets" NUM="2"> 
    <dog name="allMyDogs" NUM="5"> 
     <dog name="Frank" cute="yes" color"brown" type="Lab" NUM="3"/> 
     <dog name="Frank" NUM="3"/> 
     <dog name="Spot" NUM="4"/> 
     <dog name="Rover" cute="yes" NUM="1"/> 
     <dog name="Rupert" cute="yes" type="Pug" color="black" NUM="6"/> 
     <cat name="Lucy" cute="yes" NUM="4"/> 
    </dog> 
    <cat name="allMyCats" NUM="4"> 
     <cat name="Simba" cute="yes" NUM="4"/> 
     <cat name="Princess" cute="no" color="black" NUM="5"/> 
     <cat name="Fluffy" cute="yes" color="grey" NUM="1"/> 
     <cat name="Lucy" cute="yes" color="brown" NUM="3"> 
      <cat name="Lucy" cute="no" NUM="35"/> 
      <cat name="Lucy" cute="yes" purrs="yes" NUM="6"/> 
     </cat> 
     <cat name="Lucy"cute="no" color="grey" NUM="1"/> 
     <dog name="Rover" cute="yes" NUM="24"/> 
    </cat> 
    <cat name="Lucy" NUM="9"/> 
    <dog name="Rupert Jr" cute="yes" type="Pug" color="black" NUM="0"/> 
</pets> 

这里是XSLT代码:

<xsl:key name="elem_key" match="elem" use="concat(@key, .)" /> 

    <xsl:variable name="all_data"> 
     <xsl:apply-templates select="*//*"> 
      <xsl:sort select="name()" /> 
     </xsl:apply-templates> 
    </xsl:variable> 

    <xsl:template match="//*[@NUM&lt;=4]"> 
     <elem key="{name()}"> 
      <xsl:copy-of select="@*" /> 
      <xsl:for-each select="@*"> 
       <xsl:sort select="name()" /> 
       <attribute>|<xsl:value-of select="name()" />|</attribute> 
      </xsl:for-each> 
     </elem> 
    </xsl:template> 

    <xsl:template match="/"> 
     <html> 
      <body> 
       <xsl:for-each select="msxsl:node-set($all_data)"> 
        <xsl:for-each select="*[generate-id()=generate-id(key('elem_key',concat(@key, .))[1])]"> 
         <table > 
          <tr> 
           <td>Element Name</td> 
           <xsl:for-each select="*"> 
            <td> 
             <xsl:value-of select="translate(.,'|','')" /> 
            </td> 
           </xsl:for-each> 
          </tr> 
          <xsl:for-each select="key('elem_key', concat(@key, .))"> 
           <xsl:variable name="curr_elem" select="." /> 
           <tr> 
            <td> 
             <xsl:value-of select="@key" /> 
            </td> 
            <xsl:for-each select="*"> 
             <td > 
              <xsl:value-of select="$curr_elem/@*[name()=translate(current(),'|','')]" /> 
             </td> 
            </xsl:for-each> 
           </tr> 
          </xsl:for-each> 
         </table> 
         <p /> 
        </xsl:for-each> 
       </xsl:for-each> 
      </body> 
     </html> 
    </xsl:template> 

而对于输出所需的格式:

Element Name Name NUM 
pets   myPets 2 

Element Name Name  Cute Color NUM Type 
dog   Frank  yes brown 3 Lab 
dog   Rupert Jr yes black 0 Pug 

Element Name Name NUM 
dog   Frank 3 
dog   Spot 4 

Element Name Name Cute NUM 
dog   Rover yes 1 

Element Name Name Cute NUM 
cat   Lucy yes 4 
cat   Simba yes 4 

Element Name Name  NUM 
cat   allMyCats 4 

Element Name Name Color Cute NUM 
cat   Fluffy grey yes 1 
cat   Lucy brown yes 3 
cat   Lucy grey no 1 

谢谢! :)让我知道如果我需要清除任何东西!

+0

您忘了提供您想要的转换输出。请。 – 2010-08-11 19:51:09

+0

@Dimitre:谢谢你指出。更新所需的输出。 – developer 2010-08-11 20:37:21

+0

我认为我的答案现在包含您需要的解决方案(+1)。 :) – 2010-08-11 20:50:28

回答

2

这种转变固定所有的提到的问题

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
exclude-result-prefixes="msxsl"> 

    <xsl:key name="elem_key" match="elem" use="." /> 

    <xsl:key name="elem_key2" match="elem" 
    use="concat(@key, @name, .)" /> 

    <xsl:variable name="all_data"> 
     <xsl:apply-templates select="//*[@NUM&lt;=4]"> 
      <xsl:sort select="name()" /> 
     </xsl:apply-templates> 
    </xsl:variable> 

    <xsl:template match="*"> 
     <elem key="{name()}"> 
      <xsl:copy-of select="@*" /> 
      <xsl:for-each select="@*"> 
       <xsl:sort select="name()" /> 
       <attribute>|<xsl:value-of select="name()" />|</attribute> 
      </xsl:for-each> 
     </elem> 
    </xsl:template> 

    <xsl:template match="/"> 
     <html> 
      <body> 
       <xsl:for-each select="msxsl:node-set($all_data)"> 
        <xsl:for-each select= 
        "*[generate-id() 
         = 
         generate-id(key('elem_key',.)[1]) 
         ]"> 
         <table > 
          <tr> 
           <td>Element Name</td> 
           <xsl:for-each select="*"> 
            <td> 
             <xsl:value-of select= 
              "translate(.,'|','')" /> 
            </td> 
           </xsl:for-each> 
          </tr> 
          <xsl:for-each select="key('elem_key',.)"> 
           <xsl:variable name="curr_elem" select="." /> 
           <tr> 
            <td> 
             <xsl:value-of select="@key" /> 
            </td> 
            <xsl:for-each select="*"> 
             <td > 
              <xsl:value-of select= 
              "$curr_elem/@* 
               [name() 
               = 
               translate(current(), 
                 '|', 
                 '' 
                 ) 
               ]" /> 
             </td> 
            </xsl:for-each> 
           </tr> 
          </xsl:for-each> 
         </table> 
         <p /> 
        </xsl:for-each> 
       </xsl:for-each> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

当这个变换所提供的XML文档施加:

<pets name="myPets" NUM="2"> 
    <dog name="allMyDogs" NUM="5"> 
     <dog name="Frank" cute="yes" color="brown" type="Lab" NUM="3"/> 
     <dog name="Frank" NUM="3"/> 
     <dog name="Spot" NUM="4"/> 
     <dog name="Rover" cute="yes" NUM="1"/> 
     <dog name="Rupert" cute="yes" type="Pug" color="black" NUM="6"/> 
     <cat name="Lucy" cute="yes" NUM="4"/> 
    </dog> 
    <cat name="allMyCats" NUM="4"> 
     <cat name="Simba" cute="yes" NUM="4"/> 
     <cat name="Princess" cute="no" color="black" NUM="5"/> 
     <cat name="Fluffy" cute="yes" color="grey" NUM="1"/> 
     <cat name="Lucy" cute="yes" color="brown" NUM="3"> 
      <cat name="Lucy" cute="no" NUM="35"/> 
      <cat name="Lucy" cute="yes" purrs="yes" NUM="6"/> 
     </cat> 
     <cat name="Lucy" cute="no" color="grey" NUM="1"/> 
     <dog name="Rover" cute="yes" NUM="24"/> 
    </cat> 
    <cat name="Lucy" NUM="9"/> 
    <dog name="Rupert Jr" cute="yes" type="Pug" color="black" NUM="0"/> 
</pets> 

有用结果产生

<html> 
    <body> 
     <table> 
      <tr> 
       <td>Element Name</td> 
       <td>cute</td> 
       <td>name</td> 
       <td>NUM</td> 
      </tr> 
      <tr> 
       <td>cat</td> 
       <td>yes</td> 
       <td>Lucy</td> 
       <td>4</td> 
      </tr> 
      <tr> 
       <td>cat</td> 
       <td>yes</td> 
       <td>Simba</td> 
       <td>4</td> 
      </tr> 
      <tr> 
       <td>dog</td> 
       <td>yes</td> 
       <td>Rover</td> 
       <td>1</td> 
      </tr> 
     </table> 
     <p></p> 
     <table> 
      <tr> 
       <td>Element Name</td> 
       <td>name</td> 
       <td>NUM</td> 
      </tr> 
      <tr> 
       <td>cat</td> 
       <td>allMyCats</td> 
       <td>4</td> 
      </tr> 
      <tr> 
       <td>dog</td> 
       <td>Frank</td> 
       <td>3</td> 
      </tr> 
      <tr> 
       <td>dog</td> 
       <td>Spot</td> 
       <td>4</td> 
      </tr> 
      <tr> 
       <td>pets</td> 
       <td>myPets</td> 
       <td>2</td> 
      </tr> 
     </table> 
     <p></p> 
     <table> 
      <tr> 
       <td>Element Name</td> 
       <td>color</td> 
       <td>cute</td> 
       <td>name</td> 
       <td>NUM</td> 
      </tr> 
      <tr> 
       <td>cat</td> 
       <td>grey</td> 
       <td>yes</td> 
       <td>Fluffy</td> 
       <td>1</td> 
      </tr> 
      <tr> 
       <td>cat</td> 
       <td>brown</td> 
       <td>yes</td> 
       <td>Lucy</td> 
       <td>3</td> 
      </tr> 
      <tr> 
       <td>cat</td> 
       <td>grey</td> 
       <td>no</td> 
       <td>Lucy</td> 
       <td>1</td> 
      </tr> 
     </table> 
     <p></p> 
     <table> 
      <tr> 
       <td>Element Name</td> 
       <td>color</td> 
       <td>cute</td> 
       <td>name</td> 
       <td>NUM</td> 
       <td>type</td> 
      </tr> 
      <tr> 
       <td>dog</td> 
       <td>brown</td> 
       <td>yes</td> 
       <td>Frank</td> 
       <td>3</td> 
       <td>Lab</td> 
      </tr> 
      <tr> 
       <td>dog</td> 
       <td>black</td> 
       <td>yes</td> 
       <td>Rupert Jr</td> 
       <td>0</td> 
       <td>Pug</td> 
      </tr> 
     </table> 
     <p></p> 
    </body> 
</html> 
+0

@Dimitre:**嗯..我认为结果有重复。**我认为应该只有12个结果回来。哦,原来我想要在不同的标题下使用不同的节点(猫vs狗),但我想我可能会对你的显示方式很好(更简洁) - 我只需要确保它按照元素名称排序。 – developer 2010-08-11 21:06:05

+0

@Dimitre:对于你从这个职业获得的所有答案+1。 JA! – 2010-08-11 21:21:35

+0

@iHeartGreek:感谢您的注意。我现在已经解决了这个最后的问题,现在转换产生了所需的结果。 – 2010-08-12 02:47:56