尝试使用XSLT选择两个元素

时间:2015-04-10 14:58:16

标签: xml xslt

你好,我试图只展示voorgerechten和hoofdgerechten。目前我正在输出:

enter image description here

这是xml代码:

<?xml version="1.0"?>
<?xml-stylesheet href="menuFromattributeToElement.xslt" type="text/xsl"?>
<menu>
  <voorgerechten>
    <gerecht id="1" prijs="3.95">Groene salade</gerecht>
    <gerecht id="2" prijs="4.35">Tomatensoep</gerecht>
    <gerecht id="3" prijs="9.95">Carpaccio</gerecht>
  </voorgerechten>
  <hoofdgerechten>
    <gerecht id="4" prijs="19.95">Gegrilde ossehaas</gerecht>
    <gerecht id="5" prijs="15.95">Linguini al Pesto</gerecht>
    <gerecht id="6" prijs="18.95">Gepocheerde zalm</gerecht>
  </hoofdgerechten>
  <desserts>
    <gerecht id="7" prijs="5.95">Dame Blanche</gerecht>
    <gerecht id="8" prijs="7.45">Banana Split</gerecht>
  </desserts>
</menu>

这是xslt代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html"/>
 <xsl:template match="/">
   <html>
     <body>
     <table border="1px">
       <tr>
         <td colspan="6" align="center">
             <h2> Gerechten</h2>
         </td>
       </tr>
       <tr>
         <th>Naam</th>
         <th>Prijs</th>
         <th>ID</th> 
       </tr>
       <xsl:for-each select="//gerecht">
         <tr>
           <td>
             <xsl:value-of select="text()"/>
           </td>
           <td>
             <xsl:value-of select="translate(@prijs, '.', ',')"/>
           </td>
           <td>
             <xsl:value-of select="@id"/>
           </td> 
         </tr>
       </xsl:for-each>
     </table>
   </body>
   </html>
 </xsl:template>
</xsl:stylesheet>

在xslt文件中,我已经尝试替换:

<xsl:for-each select="//gerecht">

用这个:

<xsl:for-each select="//menu/voorgerechten/gerecht or //menu/hoofdgerechten/gerecht">

因此它只输出居住在voorgerechten或hoofdgerecht内的gerecht。但遗憾的是我的代码无效。

1 个答案:

答案 0 :(得分:2)

你真的很亲近。你不想要or,你想要|

<xsl:for-each select="/menu/voorgerechten/gerecht | /menu/hoofdgerechten/gerecht">

原因是:or是逻辑运算符,|是union运算符。当您使用or时,您正试图让select使用布尔值(truefalse),这并不是真的有意义。当您使用union运算符时,您现在正在处理节点集的并集,这是select正在寻找的。另外,您在开头不需要//,因为它只是一个<menu>元素,因为它是根元素。

您可能需要考虑将for-each重构为模板,或者几个模板 - 这样可以更轻松地稍后更改其中一个或另一个类型,或者添加其他类型。但是for-each在这里工作得很好,所以这取决于你。

这是XSLTransform: http://xsltransform.net/eiZQaFx