XSL没有正确应用模板

时间:2017-05-20 12:22:56

标签: xml xslt xpath

早上好!

我有这个XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="Relatorio.xsl"?>
<relatório id="LPROG" xmlns="http://www.dei.isep.ipp.pt/lprog"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.dei.isep.ipp.pt/lprog Relatorio.xsd">
    <páginaRosto>
        <tema>oRolhas</tema>

        <!--Bunch of other fields-->

    </páginaRosto>

    <!--Bunch of other fields-->

</relatório>

使用给定的XSD正确地形成和验证XML。

应用这个简单的.xsl:

之后
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
        <html>
            <head>
                <title/>
            </head>
            <body>
                <h1 align="center">Relatório Trabalho</h1>
                <xsl:apply-templates select="relatório/páginaRosto"/>
            </body>
        </html>
    </xsl:template>


    <xsl:template match="páginaRosto">
        <h1>Page</h1>
        <h2>Tema:
            <xsl:value-of select="tema"/>
        </h2>
    </xsl:template>



</xsl:stylesheet>

输出结果为:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body><h1 align="center">Relatório Trabalho</h1></body>
</html>

它不是“打印”“páginaRosto”模板,我无法弄清楚原因。 我的XPath表达式甚至XML文件有问题吗?

提前致谢

2 个答案:

答案 0 :(得分:0)

xml定义了默认命名空间xmlns="http://www.dei.isep.ipp.pt/lprog"

要匹配默认命名空间中的元素,XPath表达式必须使用相同的命名空间(但必须定义非空前缀):

<xsl:apply-templates 
    xmlns:p="http://www.dei.isep.ipp.pt/lprog"      
    select="p:relatório/p:páginaRosto"/>

答案 1 :(得分:0)

XML:

<relatório id="LPROG" xmlns:lp="http://www.dei.isep.ipp.pt/lprog" 
    ...
</relatório>

XSL:

<xsl:apply-templates xmlns:lp="http://www.dei.isep.ipp.pt/lprog" select="relatório/páginaRosto"/>

结果:

<html>
   <head>
      <title/>
   </head>
   <body>
      <h1 align="center">Relatório Trabalho</h1>
      <h1>Page</h1>
      <h2>Tema:
            oRolhas</h2>
   </body>
</html>