如果我的XML文件具有与之关联的Schema,则XSLT不起作用

时间:2011-04-30 17:32:38

标签: xml xslt schema xsd

如果我从XML中删除Schema定义,那么我的XSLT可以正常工作,但我不能让它与定义的Schema一起工作。我知道这个问题已经得到了解答here,但我似乎无法让我的工作。我有以下XML标头:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="student.xsl"?>
<Students xmlns="http:/www.example.com" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
xsi:schemaLocation="http://www.example.com student.xsd">

<Student>
    <SSN>622-12-5748</SSN>
    <Name>
        <First-Name>Alexander</First-Name>
        <Last-Name>Mart</Last-Name>
    </Name>
    <Age>26</Age>
    <Institution>UCSF</Institution>
    <Email>Alexander@yahoo.com</Email>
</Student>
</Students>

这是我的XSLT文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:fo="http://www.w3.org/1999/XSL/Format" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fn="http://www.w3.org/2005/xpath-functions" 
xmlns:xsi="http://www.example.com">
<xsl:template match="/">
    <html>
        <body>
            <h2>Student Information</h2>
            <table border="1">
                <tr bgcolor="yellow">
                    <th>SSN</th>
                    <th>First Name</th>
                </tr>
                <xsl:for-each select="xsi:Students/Student">
                    <tr>
                        <td>
                            <xsl:value-of select="xsi:SSN"/>
                        </td>
                        <td>
                            <xsl:value-of select="xsi:Name/First-Name"/>
                        </td>
                    </tr>
                </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>

我犯了什么愚蠢的错误?提前谢谢!

2 个答案:

答案 0 :(得分:3)

  

我犯了什么愚蠢的错误?谢谢   提前!

因为XML文档位于默认命名空间中,并且因为XML文档没有属于“无命名空间”的节点,所以任何XPath表达式中任何未加前缀的元素名称都不会选择任何内容。

您已开始使用带前缀的名称,但不是完全使用。

更改

           <xsl:for-each select="xsi:Students/Student"> 

           <xsl:for-each select="xsi:Students/xsi:Student"> 

并更改:

<xsl:value-of select="xsi:Name/First-Name"/>

<xsl:value-of select="xsi:Name/xsi:First-Name"/>

答案 1 :(得分:1)

尝试在for-each select

中使用“xsi:Students / xsi:Student”

编辑: 并以您的名字选择:“xsi:Name / xsi:First-Name”