.xml,.xsd和.xsl标题问题

时间:2015-03-29 02:03:17

标签: xml xslt xsd

我制作了一个关于音乐内容的.xml,我也制作了一个.xsd,我对.xsd验证了.xml并且工作正常,然后我做了.xsl来显示.xml里面的数据,它当.xml没有这一行时工作正常:xmlns =“http://www.w3schools.com,它只显示< xsl:for-each select =”目录/歌曲“>之前的数据:

<?xml version="1.0" encoding="UTF-8"?>
<html>
<body>
  <h2>Billboard Top 5</h2>
  <table border="1">
     <tr>
        <th>Name</th>
        <th>Artist</th>
        <th>Album</th>
        <th>Year</th>
        <th>Genre</th>
        <th>Comments</th>
        <th>Path</th>
     </tr>
  </table>
</body>
</html>

但是当我从catalog标签中删除这个属性时,它可以正常工作:

<?xml version="1.0" encoding="UTF-8"?>
<html>
<body>
  <h2>Billboard Top 5</h2>
  <table border="1">
     <tr>
        <th>Name</th>
        <th>Artist</th>
        <th>Album</th>
        <th>Year</th>
        <th>Genre</th>
        <th>Comments</th>
        <th>Path</th>
     </tr>
     <tr>
        <td>Bed of Roses</td>
        <td>Bon Jovi</td>
        <td>Cross Road</td>
        <td>1995</td>
        <td>rock</td>
        <td>
           <table>
              <tr>
                 <td>joe: it's such a good song</td>
              </tr>
              <tr>
                 <td>maria: really cool</td>
              </tr>
              <tr>
                 <td>mat: fantastic</td>
              </tr>
           </table>
        </td>
        <td>C://music/bon jovi</td>
     </tr>
     <tr>
        <td>Fly Away from Here</td>
        <td>Aerosmith</td>
        <td>Just Push Play</td>
        <td>2001</td>
        <td>rock</td>
        <td>
           <table>
              <tr>
                 <td>elisa: awesome</td>
              </tr>
              <tr>
                 <td>maria: just fine</td>
              </tr>
           </table>
        </td>
        <td>C://music/aerosmith</td>
     </tr>
     <tr>
        <td>Down</td>
        <td>Blink 182</td>
        <td>Blink 182</td>
        <td>2001</td>
        <td>pop</td>
        <td>
           <table>
              <tr>
                 <td>richard: alucinant</td>
              </tr>
              <tr>
                 <td>maria: really fine</td>
              </tr>
           </table>
        </td>
        <td>C://music/blink 182</td>
     </tr>
     <tr>
        <td>Want you bad</td>
        <td>The Offspring</td>
        <td>Conspiracy of One</td>
        <td>2000</td>
        <td>pop</td>
        <td>
           <table>
              <tr>
                 <td>it's old school music</td>
              </tr>
              <tr>
                 <td>maria: love it</td>
              </tr>
           </table>
        </td>
        <td>C://music/the offspring</td>
     </tr>
     <tr>
        <td>The One that you love</td>
        <td>Air Supply</td>
        <td>The One that you love</td>
        <td>1981</td>
        <td>pop</td>
        <td>
           <table>
              <tr>
                 <td>peter: such a classic love song</td>
              </tr>
              <tr>
                 <td>maria: it makes me cry xD</td>
              </tr>
           </table>
        </td>
        <td>C://music/air supply</td>
     </tr>
  </table>
</body>
</html>

我正在使用此页面构建我的xslt:http://www.freeformatter.com/

我认为问题出现在目录标签的标题中,这里是我的.xml和xsl:

.XML

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="catalog.xsl"?>
<catalog 
 xmlns="http://www.w3schools.com" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://www.w3schools.com catalog.xsd">

<song>
 <name2>Bed of Roses</name2>
 <artist>Bon Jovi</artist>
 <album>Cross Road</album>
 <year>1995</year>
 <genre>rock</genre>
 <comments>joe: it's such a good song</comments>
 <comments>maria: really cool</comments>
 <comments>mat: fantastic</comments>
 <path>C://music/bon jovi</path>
</song>
<song>
 <name2>Fly Away from Here</name2>
 <artist>Aerosmith</artist>
 <album>Just Push Play</album>
 <year>2001</year>
 <genre>rock</genre>
 <comments>elisa: awesome</comments>
 <comments>maria: just fine</comments>
 <path>C://music/aerosmith</path>
</song>
<song>
 <name2>Down</name2>
 <artist>Blink 182</artist>
 <album>Blink 182</album>
 <year>2001</year>
 <genre>pop</genre>
 <comments>richard: alucinant</comments>
 <comments>maria: really fine</comments>
 <path>C://music/blink 182</path>
</song>
<song>
 <name2>Want you bad</name2>
 <artist>The Offspring</artist>
 <album>Conspiracy of One</album>
 <year>2000</year>
 <genre>pop</genre>
 <comments>it's old school music</comments>
 <comments>maria: love it</comments>
 <path>C://music/the offspring</path>
</song>
<song>
 <name2>The One that you love</name2>
 <artist>Air Supply</artist>
 <album>The One that you love</album>
 <year>1981</year>
 <genre>pop</genre>
 <comments>peter: such a classic love song</comments>
 <comments>maria: it makes me cry xD</comments>
 <path>C://music/air supply</path>
</song>

</catalog>

.XSD

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
       targetNamespace="http://www.w3schools.com"
       xmlns:w3="http://www.w3schools.com"
       elementFormDefault="qualified">

<xs:element name="catalog">
 <xs:complexType>
  <xs:sequence>
    <xs:element name="song" minOccurs="5" maxOccurs="5">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="name2" type="xs:string"/>
          <xs:element name="artist" type="xs:string"/>
          <xs:element name="album" type="xs:string"/>
          <xs:element name="year" type="xs:integer"/>
          <xs:element name="genre" minOccurs="0">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="pop"/>
                <xs:enumeration value="rock"/>
                <xs:enumeration value="jazz"/>
              </xs:restriction>
            </xs:simpleType>
          </xs:element>                     
          <xs:element name="comments" minOccurs="0" maxOccurs="unbounded"
           type="xs:string"/>      
          <xs:element name="path" type="xs:string"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
  </xs:sequence>
</xs:complexType>
<xs:unique name="catalog-song-name2-unique">
  <xs:selector xpath="w3:song"/>
  <xs:field xpath="w3:name2"/>
</xs:unique>
</xs:element>
</xs:schema>

的.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">

<html>
<body>
  <h2>Billboard Top 5</h2>
    <table border="1">
      <tr>
        <th>Name</th>
        <th>Artist</th>
        <th>Album</th>
        <th>Year</th>
        <th>Genre</th>
        <th>Comments</th>
        <th>Path</th>           
      </tr>
      <xsl:for-each select="catalog/song">
      <tr>
        <td><xsl:value-of select="name2"/></td>
        <td><xsl:value-of select="artist"/></td>
        <td><xsl:value-of select="album"/></td>
        <td><xsl:value-of select="year"/></td>
        <td><xsl:value-of select="genre"/></td>
        <td>
          <table>
            <xsl:for-each select="comments">
            <tr>
              <td><xsl:value-of select="."/></td>
            </tr>
            </xsl:for-each>
          </table>
        </td>
        <td><xsl:value-of select="path"/></td>
      </tr>
      </xsl:for-each>
    </table>
 </body>
 </html>  
</xsl:template>
</xsl:stylesheet>

就像我之前说过的,这是一个标题问题,标题我指的是主标签的属性。我的.xml和.xsd由本网站的专家检查过,所以不要担心它们。

1 个答案:

答案 0 :(得分:1)

要使XPath起作用,必须在命名空间限定元素上使用名称空间前缀。这就是删除默认命名空间时它的工作原理。因此,要么从源文档中删除xmlns=,要么在元素前添加前缀,并在XSLT中声明(并使用)该前缀。

或者,在XPath中使用local-name函数,如下所示:

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

<xsl:template match="/">    

<html>
<body>
  <h2>Billboard Top 5</h2>
    <table border="1">
      <tr>
        <th>Name</th>
        <th>Artist</th>
        <th>Album</th>
        <th>Year</th>
        <th>Genre</th>
        <th>Comments</th>
        <th>Path</th>           
      </tr>
      <xsl:for-each select="*[local-name()='catalog']/*[local-name()='song']">
      <tr>
        <td><xsl:value-of select="*[local-name()='name2']"/></td>
        <td><xsl:value-of select="*[local-name()='artist']"/></td>
        <td><xsl:value-of select="*[local-name()='album']"/></td>
        <td><xsl:value-of select="*[local-name()='year']"/></td>
        <td><xsl:value-of select="*[local-name()='genre']"/></td>
        <td>
          <table>
            <xsl:for-each select="*[local-name()='comments']">
            <tr>
              <td><xsl:value-of select="."/></td>
            </tr>
            </xsl:for-each>
          </table>
        </td>
        <td><xsl:value-of select="*[local-name()='path']"/></td>
      </tr>
      </xsl:for-each>
    </table>
 </body>
 </html>  
</xsl:template>
</xsl:stylesheet>

请注意,如果在不同的命名空间中具有相同local-name()的元素,则此方法将导致问题。在这种情况下,您可以在所有and namespace-uri()='http://www.w3schools.com'之后添加local-name()='...',它会照顾到这一点,但如果您不必担心本地名称冲突,那么语法会变得有点麻烦(如在您的示例文档中)。