.xml、.xsd 和 .xsl headers 问题
.xml, .xsd and .xsl headers issue
我制作了一个关于音乐内容的 .xml,我还制作了一个 .xsd 并且我验证了 .xml 与 .xsd 并且它有效很好,然后我制作了一个 .xsl 来显示 .xml 中的数据,当 .xml 没有这一行时它工作正常:xmlns="http://www.w3schools.com, it just shows the data before the < xsl:for-each select="catalog/song">:
<?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>
但是当我从目录标签中删除这个属性时它工作正常:
<?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/
我认为问题出在目录选项卡的 header 中,这里是我的 .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>
正如我之前所说,这是一个 header 问题,header 我指的是主要标签的属性。我的 .xml 和 .xsd 已由该站点的专家检查过。所以不用担心。
要使 XPath 起作用,您的命名空间限定元素必须有命名空间前缀。这就是当您删除默认名称空间时它起作用的原因。因此,要么从源文档中删除 xmlns=
,要么为元素添加前缀并在 XSLT 中声明(并使用)该前缀。
或者,在您的 XPath 中使用本地名称函数,如下所示:
<?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()
的元素,此方法会导致问题。在这种情况下,您可以在所有 local-name()='...'
之后添加 and namespace-uri()='http://www.w3schools.com'
并且它会解决这个问题,但是如果您不必担心本地名称冲突(例如在您的示例文档中)。
我制作了一个关于音乐内容的 .xml,我还制作了一个 .xsd 并且我验证了 .xml 与 .xsd 并且它有效很好,然后我制作了一个 .xsl 来显示 .xml 中的数据,当 .xml 没有这一行时它工作正常:xmlns="http://www.w3schools.com, it just shows the data before the < xsl:for-each select="catalog/song">:
<?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>
但是当我从目录标签中删除这个属性时它工作正常:
<?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/
我认为问题出在目录选项卡的 header 中,这里是我的 .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>
正如我之前所说,这是一个 header 问题,header 我指的是主要标签的属性。我的 .xml 和 .xsd 已由该站点的专家检查过。所以不用担心。
要使 XPath 起作用,您的命名空间限定元素必须有命名空间前缀。这就是当您删除默认名称空间时它起作用的原因。因此,要么从源文档中删除 xmlns=
,要么为元素添加前缀并在 XSLT 中声明(并使用)该前缀。
或者,在您的 XPath 中使用本地名称函数,如下所示:
<?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()
的元素,此方法会导致问题。在这种情况下,您可以在所有 local-name()='...'
之后添加 and namespace-uri()='http://www.w3schools.com'
并且它会解决这个问题,但是如果您不必担心本地名称冲突(例如在您的示例文档中)。