Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html XML解析:如何将相同类型的同级分离到不同的单元中?_Html_Xml_Xslt_Xpath - Fatal编程技术网

Html XML解析:如何将相同类型的同级分离到不同的单元中?

Html XML解析:如何将相同类型的同级分离到不同的单元中?,html,xml,xslt,xpath,Html,Xml,Xslt,Xpath,XML文件: <books> <scifi key=...> <author>Don Larson</author> <title>The Edge</title> <year>...</year> </scifi> <scifi key=...> <author>Don Larson&

XML文件:

<books>
    <scifi key=...>
       <author>Don Larson</author>
       <title>The Edge</title>
       <year>...</year>
    </scifi>
    <scifi key=...>
       <author>Don Larson</author>
       <author>James Kiddleton</author>
       <author>Danny Wobers</author>
       <title>Incognitum</title>
       <year>1987</year>
    </scifi>
    <scifi key=...>
       <author>....</author>
       <author>....</author>
       <title>...</title>
       <year>...</year>
    </scifi>
    etc......................
</books>
现在,我要做的是为每个标题在单独的单元格中显示与之相关的作者(如果有多个作者…),并得到如下内容:

    Title         Authors        Year
   (3cells)        (3cells)    (3cells)
    -----         -------        ----
 Incognitum      Don Larson      1987
 Incognitum   James Kiddleton    1987
 Incognitum     Danny Wobers     1987
我不想让一个单元格作为标题,一个单元格包含与该标题相关的所有三位作者,我想让三个单元格具有相同的标题,每个单元格旁边都可以有一个单元格,旁边有一位相关作者

我仍然希望继续按yeat对所有内容进行排序,并且我仍然希望单元格的顺序(左->右)为Title->Author->Year


我必须在XSL文件中更改哪些内容?

您希望每个作者都有一行,所以请更改

<tr>
  <td><center><xsl:value-of select="title"/></center></td>
  <td>
   <xsl:for-each select="author">
    <p><xsl:value-of select="."/></p>
    </xsl:for-each>
  </td> 
  <td><xsl:value-of select="year"/></td>
</tr>


David

快速修复是

<xsl:template match="/">
  <html>
  <body>
    <center><h1>SciFi</h1>
    <table border="1">
    <tr>
      <th>Title</th>
      <th>Authors</th>
      <th>Year</th>
    </tr>
      <xsl:for-each select="books/scifi">
        <xsl:sort select="year"/>
        <xsl:for-each select="author">
    <tr>
      <td><center><xsl:value-of select="../title"/></center></td>
      <td>
       <xsl:for-each select=".">
        <p><xsl:value-of select="."/></p>
        </xsl:for-each>
      </td> 
      <td><xsl:value-of select="../year"/></td>
    </tr>
       </xsl:for-each>
    </xsl:for-each>
    </table>
    </center>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet> 

科幻小说
标题
作者
年


但从长远来看,我建议从一个模板(使用嵌套for each实现所有功能)转移到结构化样式表(使用将每个元素类型映射到结果的模板),然后使用应用模板继续进行操作。

谢谢,正如您所见,我已编辑了我的问题,并添加了html文件的一个片段,我只想在用户单击“作者”按钮时,通过jscript函数应用您建议的更改。当涉及到我必须在
setAttribute
等中进行的更改时,我有点不知所措。。。这方面有什么帮助吗?我不使用那个API,但使用.evaluate(用于计算源代码中的xpath表达式,您不能只提取程序的随机行并断章取义地进行计算。感谢您的回答Martin,看看我给David留下的评论,告诉我您的想法:)我认为您最初的XSLT问题已经得到了回答和解决,如果您需要帮助,您应该发布一个新的问题,标记为Javascript。我听从了您的建议。如果你想再帮我一点,请尽管说:)谢谢!
<tr>
  <td><center><xsl:value-of select="title"/></center></td>
  <td>
   <xsl:for-each select="author">
    <p><xsl:value-of select="."/></p>
    </xsl:for-each>
  </td> 
  <td><xsl:value-of select="year"/></td>
</tr>
 <xsl:for-each select="author">
<tr>
  <td><center><xsl:value-of select="../title"/></center></td>
  <td>

    <xsl:value-of select="."/>

  </td> 
  <td><xsl:value-of select="../year"/></td>
</tr>
  </xsl:for-each>
<xsl:template match="/">
  <html>
  <body>
    <center><h1>SciFi</h1>
    <table border="1">
    <tr>
      <th>Title</th>
      <th>Authors</th>
      <th>Year</th>
    </tr>
      <xsl:for-each select="books/scifi">
        <xsl:sort select="year"/>
        <xsl:for-each select="author">
    <tr>
      <td><center><xsl:value-of select="../title"/></center></td>
      <td>
       <xsl:for-each select=".">
        <p><xsl:value-of select="."/></p>
        </xsl:for-each>
      </td> 
      <td><xsl:value-of select="../year"/></td>
    </tr>
       </xsl:for-each>
    </xsl:for-each>
    </table>
    </center>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>