3

我已经搜索了互联网/并在此处发布帖子,以尝试找到我所遇到问题的答案。我正在学习 XML,并且有一个任务,我必须将以前的 .xml 转换为 .xslt。我已经得到了所有这些,但有一小部分代码找不到我输入的值。例如; 我知道可能有很多其他方法可以实现这一点,但这是我得到的代码。

.xml的一部分如下:

     <collection>
     <movie>
     <title>Braveheart</title>
     <genre v_genre="Action"/>
     <rating v_rating="R"/>
     <grading v_grading="4"/>
        <summary>William Wallace, a commoner, unites the 13th Century Scots in their battle to overthrow Englands rule </summary>
    <year>1995</year>
    <director>Mel Gibson</director>
    <runtime>177</runtime>
    <studio>Icon Entertainment International</studio>
    <actors>
        <actor ID="001">Mel Gibson</actor>
        <actor ID="002">Sophie Marceau</actor>
        <actor ID="003">Patrick McGoohan</actor>
    </actors>
</movie>

现在为此我不明白它的价值。如果有人可以帮助我理解那部分,我将不胜感激。问题的第 2 部分将转到一个 .xslt 文档,所有内容都正确填充,但以下部门除外:流派、评级和分级。我尝试了多种不同的方法来尝试获取要填充的值。这是代码的一部分。

<xslt:for-each select="collection/movie">

 <tr>

 <td>

 <xslt:value-of select="title"/>

 </td>

 <td>

  <xslt:value-of select="genre"/>

 </td>

 <td>

<xslt:value-of select="rating/v_rating"/>

</td>

<td>

 <xslt:value-of select="grading/v_grading"/>

 </td>
 <td>
 <xslt:value-of select="summary"/>
 </td>               
 <td>
  <xslt:value-of select="year"/>
  </td>
   <td>
  <xslt:value-of select="director"/>
  </td>
  <td>
  <xslt:value-of select="runtime"/>
   </td>
   <td>
    <xslt:value-of select="studio"/>
   </td>
   <td>
  <xslt:value-of select="actors"/>
  </td>
  </tr>

 </xslt:for-each>

  </table>

 </body>

  </html>

  </xslt:template>
  </xslt:stylesheet>

我试图真正理解为什么将来使用这种方式。整个大学的事情。希望这不会被删除。我已经搜索了很多地方来弄清楚这一点,但没有任何例子以这种方式列出。提前谢谢你。

4

1 回答 1

2

您遇到问题的元素是这些

 <genre v_genre="Action"/>
 <rating v_rating="R"/>
 <grading v_grading="4"/>

因此,如果您注意到,您想要的值保存在属性中,而不是子文本节点中。因此,您需要将您的xsl:value-of更改为此(在流派的示例中

<xsl:value-of select="genre/@v_genre"/>

如果您热衷于学习 XSLT,可能值得知道使用xsl:apply-templates优于xsl:for-each。此外,您应该考虑删除代码中的重复。查看您的示例,表格单元格的输出顺序与 XML 中的子元素相同。因此,您可以创建一个通用模板来匹配大多数子元素以输出表格单元格。

试试这个 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:template match="/collection">
      <table>
         <xsl:apply-templates select="movie"/>
      </table>
   </xsl:template>

   <xsl:template match="movie">
      <tr>
         <xsl:apply-templates/>
      </tr>
   </xsl:template>

   <xsl:template match="genre">
      <td>
         <xsl:value-of select="@v_genre"/>
      </td>
   </xsl:template>

   <xsl:template match="rating">
      <td>
         <xsl:value-of select="@v_rating"/>
      </td>
   </xsl:template>

   <xsl:template match="grading">
      <td>
         <xsl:value-of select="@v_grading"/>
      </td>
   </xsl:template>

   <xsl:template match="*">
      <td>
         <xsl:value-of select="."/>
      </td>
   </xsl:template>
</xsl:stylesheet>

请注意,XSLT 处理器将匹配更具体的命名元素(例如, genre),然后再匹配最后的通用模板*

于 2012-11-26T17:55:40.683 回答