如何在XSL中忽略xml命名空间?

时间:2012-08-06 06:57:16

标签: xslt xslt-2.0

我有一个包含空xmlns:tag0=''的xml有没有办法可以一起忽略命名空间或者为它添加一些默认值? 因为它阻止我的xml打开xsl转换。它说Reference to undeclared namespace prefix: 'tag0'.

或者有没有办法可以在开头用xmlns:tag0=''替换xmlns:tag0='http://www.w3.org/TR/html4/

创建问题的xml的某些部分(xml大约为2MB)

<nodemetadata><imx:IMX versiondomainservice='2.4.1' versioncommon='2.2.0' serializationSpecVersion='4.0' xsi:schemaLocation='http://com.abc.imx IMX.xsd http://com.abc.aspd.metadata.domainservice/2 com.abc.aspd.metadata.domainservice.xsd http://com.abc.aspd.metadata.common/2 com.abc.aspd.metadata.common.xsd' crcEnabled='0' xmlns:imx='http://com.abc.imx' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><tag0:GatewayNodeConfig adminconsolePort='10073' nodeName='node01_rox.abc.com' imx:id='U:qywCXNr7EeG7SZfVCvSloA' domainName='Domain_rox.abc.com' dbConnectivity='ID_1' adminconsoleShutdownPort='10074' xmlns:tag0='http://com.abc.aspd.metadata.domainservice/2'><tag1:address port='10071' xsi:type='common:NodeAddress' host='rox.abc.com' httpPort='8080' imx:id='ID_2' xmlns:tag1=''></tag1:address><portals><tag1:NodeRef xsi:type='common:NodeRef' address='ID_2' nodeName='node01_rox.abc.com' imx:id='ID_3' xmlns:tag1=''></tag1:NodeRef></portals></tag0:GatewayNodeConfig><tag0:DBConnectivity imx:id='ID_1' dbConnectString='jdbc:abc:oracle:%2F%2FforKnight:1521%3BServiceName%3Dorcl%3BMaxPooledStatements%3D20%3BCatalogOptions%3D0%3BBatchPerformanceWorkaround%3Dtrue' dbType='ORACLE' dbEncryptedPassword='I7e20Erjax0wi7fY3qOaIxIBloTOBwLymgjvVVbkVcE%3D' dbUsername='lap1' xmlns:tag0='http://com.abc.aspd.metadata.domainservice/2'></tag0:DBConnectivity></imx:IMX></nodemetadata>

更新 我的XSL代码

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" 
    xmlns:tag0="http://www.w3.org/TR/html4/"
    xmlns:tag1="http://www.w3.org/TR/html4/"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:imx="http://com.abc.imx" 
    xmlns:domainservice="http://com.abc.aspd.metadata.domainservice/2"
    exclude-result-prefixes="tag0 tag1">

<xsl:include href="system_win.xsl"/>
<xsl:include href="system_nix.xsl"/>

<xsl:template match="/">
<html>
<head><link rel="stylesheet" type="text/css" href="http://www.abc.com/NR/inter2004/css/styles.css"/>
<style type="text/css">
.horz{overflow-x: auto; overflow-y: hidden;width: 98%;}
</style>
</head>
<body>
    <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />
    <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
    <xsl:for-each select="client/product">

        <h3><span style="color:#328aa4"><a name="_nodemetadata" href="#_top">Node MetaData</a></span></h3>
        <h3>Gateway Node Configuration</h3>
        <br/>
        <dd>
        <div class="horz">
            <table border="1">
                <tbody>
                <tr>
                    <th>Domain Name</th>
                    <th>Node Name</th>
                    <th>Adminconsole Port</th>
                    <th>Adminconsole Shutdown Port</th>
                    <th>DB Connectivity</th>
                </tr>
                <xsl:for-each select="nodemetadata/imx:IMX/tag0:GatewayNodeConfig">
                    <tr>
                        <td valign="top" ><xsl:value-of select="@domainName"/></td>
                        <td valign="top" ><xsl:value-of select="@nodeName"/></td>
                        <td valign="top" ><xsl:value-of select="@adminconsolePort"/></td>
                        <td valign="top" ><xsl:value-of select="@adminconsoleShutdownPort"/></td>
                        <td valign="top" ><xsl:value-of select="@dbConnectivity"/></td>
                    </tr>
                </xsl:for-each>
                </tbody>
            </table>
        </div>
        </dd>
        <br/>
    </xsl:for-each>

</body>
</html>
</xsl:template>
</xsl:stylesheet>

它在 tag0

上给了我 XML解析错误:绝不能取消前缀

1 个答案:

答案 0 :(得分:0)

修复输入XML后,以下XSLT 1.0样式表正在按要求运行:

另见http://www.xmlplayground.com/XyNCuA

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:imx="http://com.abc.imx" 
  xmlns:domainservice="http://com.abc.aspd.metadata.domainservice/2"
  exclude-result-prefixes="imx domainservice"
>
  <xsl:output method="html" />

  <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />
  <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

  <xsl:template match="/">
    <html>
    <head>
      <link rel="stylesheet" type="text/css" href="http://www.abc.com/NR/inter2004/css/styles.css"/>
      <style type="text/css">
        .horz{overflow-x: auto; overflow-y: hidden;width: 98%;}
      </style>
    </head>
    <body>
      <p>(see output source)</p>
      <xsl:apply-templates select="client/product/nodemetadata" />
    </body>
    </html>
  </xsl:template>

  <xsl:template match="nodemetadata">
    <h3><span style="color:#328aa4"><a name="_nodemetadata" href="#_top">Node MetaData</a></span></h3>
    <xsl:apply-templates select=".//domainservice:GatewayNodeConfig" />
  </xsl:template>

  <xsl:template match="domainservice:GatewayNodeConfig">
    <h3>Gateway Node Configuration</h3>
    <dd>
       <div class="horz">
         <table border="1">
           <thead>
             <tr>
               <th>Domain Name</th>
               <th>Node Name</th>
               <th>Adminconsole Port</th>
               <th>Adminconsole Shutdown Port</th>
               <th>DB Connectivity</th>
             </tr>
           </thead>
           <tbody>
             <tr>
               <td valign="top" ><xsl:value-of select="@domainName"/></td>
               <td valign="top" ><xsl:value-of select="@nodeName"/></td>
               <td valign="top" ><xsl:value-of select="@adminconsolePort"/></td>
               <td valign="top" ><xsl:value-of select="@adminconsoleShutdownPort"/></td>
               <td valign="top" ><xsl:value-of select="@dbConnectivity"/></td>
             </tr>
           </tbody>
         </table>
       </div>
     </dd>
     <br/>
   </xsl:template>
</xsl:stylesheet>

输出:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="http://www.abc.com/NR/inter2004/css/styles.css">
<style type="text/css">
        .horz{overflow-x: auto; overflow-y: hidden;width: 98%;}
      </style>
</head>
<body>
<p>(see output source)</p>
<h3><span style="color:#328aa4"><a name="_nodemetadata" href="#_top">Node MetaData</a></span></h3>
<h3>Gateway Node Configuration</h3>
<dd><div class="horz"><table border="1">
<thead><tr>
<th>Domain Name</th>
<th>Node Name</th>
<th>Adminconsole Port</th>
<th>Adminconsole Shutdown Port</th>
<th>DB Connectivity</th>
</tr></thead>
<tbody><tr>
<td valign="top">Domain_rox.abc.com</td>
<td valign="top">node01_rox.abc.com</td>
<td valign="top">10073</td>
<td valign="top">10074</td>
<td valign="top">ID_1</td>
</tr></tbody>
</table></div></dd>
<br>
</body>
</html>