XSL样式表问题中的XML命名空间引用

时间:2011-08-03 10:35:19

标签: xslt

我正在尝试从以下XML片段中提取数据:

<?xml version= "1.0" ?>
<Stmts xmlns="http://tempuri.org/Statement.xsd" Generation="2011-08-01T12:41:41" >
<StatementDetail AccountStatus="Open" CompanyID="" TransactionCount="182" >
<Transactions>
<Manual.../>
...
</Transactions>
</StatementDetail>
</Stmts>

请注意,该元素具有xmlns属性。

当我尝试使用以下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>CabCharge</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Batch</th>
        <th>TransNo</th>
      </tr>
      <xsl:for-each select="Stmt/StatementDetail/Transactions/Manual">
      <tr>
        <td><xsl:value-of select="@Batch"/></td>
        <td><xsl:value-of select="@TransNo"/></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

BUT!如果我从元素中删除XMLNS属性,我会获得数据。

我需要在XSL中指定识别名称空间???

感谢。

1 个答案:

答案 0 :(得分:0)

确保在样式表中声明文档的默认命名空间,如:

<xsl:stylesheet version="1.0"
    xmlns="http://tempuri.org/Statement.xsd"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

否则,XSLT处理器会将样式表中引用的元素视为属于默认命名空间null

此外,如果您希望从输出文档中删除命名空间,则需要为根文本元素html声明空命名空间,如:

<xsl:template match="/">
    <html xmlns="">
            <!-- your stuff -->
    </html>
</xsl:template>

请注意:

  • xsl:for-each中,您选择了错误的元素(Stmt代替Stmts
  • 输入文档中不存在BatchTransNo属性。