0

我开始学习 xml 和 xsl,但由于某种原因,我无法让 xpath 在 xsl 中为我工作。我的 xml 文档的结构是否错误,或者为什么游戏 14 的价格没有显示在表格中?

我的 xsl 尝试非常简单:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>My Games</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Game Name</th>
        <th>Price</th>
      </tr>
      <tr>
        <td><xsl:value-of select=
            "Xboxspellen/Spellen/Spel[14]/Spelnaam"/></td>
        <td><xsl:value-of select=
            "Xboxspellen/Spellen/Spel[14]/Prijs"/></td>
      </tr>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

xml 代码的较短版本:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="Xboxspellen.xsl"?>
<Xboxspellen xmlns="http://www.w3schools.com" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://www.w3schools.com 
                                 Xboxspellen.xsd">
  <Genres>
    ...
    <Genre id="Adv">
      <Genrenaam>Adventure</Genrenaam>
      <Spel idref="12"/>
      <Spel idref="13"/>
      <Spel idref="14"/>
    </Genre>
  </Genres>

  <Spellen>
    ...
    ...
    <Spel id="14">
      <Spelnaam>Omerta: city of gangsters</Spelnaam>
      <Uitgever>Kalypso</Uitgever>
      <Prijs>49.98</Prijs>
      <Leeftijd>16</Leeftijd>
      <Aankoop>
        <Dag>28</Dag>
        <Maand>04</Maand>
        <Jaar>2011</Jaar>
      </Aankoop>
      <Afbeelding>spel14.jpg</Afbeelding>
    </Spel>
  </Spellen>
</Xboxspellen>

我已经尝试了几个小时,但似乎没有找到答案,如果有人可以帮助我,我将非常感激:D

4

2 回答 2

1

你已经有了一个好的开始。现在,您已经遇到了迟早会发生在每个人身上的经典失误:您编写了一个 XPath 表达式,Xboxspellen/Spellen/Spel[14]/Spelnaam并希望它与文档中的某个元素相匹配。但是您文档中的元素没有命名Xboxspellen等:它们是命名空间限定的,并且它们都xmlns="..."在范围内具有默认命名空间声明(),因此它们的完整(扩展)名称不是Xboxspellen等,而是{http://www.w3schools.com}Xboxspellen,{http://www.w3schools.com}Spellen等。

通过使您的 XPath 表达式和您的 XML 在事物名称上达成一致来纠正这种情况。在通常情况下,这意味着:

  1. 将命名空间声明添加到 XSLT 样式表,将一些前缀(不管前缀是什么)绑定到 XML 中使用的命名空间:

    xmlns:w3s = " http://www.w3schools.com "

  2. 在 XPath 表达式中使用该前缀:

    <td><xsl:value-of select="w3s:Xboxspellen
                              /w3s:Spellen
                              /w3s:Spel[14]
                              /w3s:Spelnaam" /></td>
    <td><xsl:value-of select="w3s:Xboxspellen
                              /w3s:Spellen
                              /w3s:Spel[14]
                              /w3s:Prijs"/></td>
    

(为了清晰起见,我在 XPath 中换行;空格在 XPath 表达式中是合法的,这也是一件好事。)

现在 XPath 表达式将匹配。

于 2013-08-15T21:49:17.857 回答
1

添加:xmlns:w3="http://www.w3schools.com"到 xsl:stylesheet 元素。

并将 w3 前缀添加到您的 select 语句中的元素:

    <td><xsl:value-of select=
        "w3:Xboxspellen/w3:Spellen/w3:Spel[@id='14']/w3:Spelnaam"/></td>
    <td><xsl:value-of select=
        "w3:Xboxspellen/w3:Spellen/w3:Spel[@id='14']/w3:Prijs"/></td>

您的 xml 位于默认命名空间“ http://www.w3schools.com ”中,但您的 xsl 选择中的 xpaths 位于 null 命名空间中。他们不匹配。命名空间匹配不是通过前缀(或缺少前缀)而是通过前缀绑定到的命名空间。

{http://www.w3schools.com}/Xboxspellen != {}/Xboxspellen

有关更多信息,请参阅:XML 命名空间及其如何影响 XPath 和 XSLT

另外:默认命名空间的危险

注意:我将 "[14]" 更改为 "[@id='14']" 以使其适用于您的示例。如果该元素实际上是序列中的第 14 个,那么您不需要更改它。但如果你有身份证,那么我可能会依赖他们而不是数数。

于 2013-08-15T21:33:26.460 回答