用XSL删除XML开头(在声明之前)的空行,以便进行解析


Remove blank lines at the beginning (before declaration) of XML with XSL for parsing

我的问题是。我正在构建一个web应用程序,将xml数据提交给政府应用程序,该应用程序返回xml数据,然后我通过xslt解析为html以供查看。问题是返回的xml在声明

之前有2(两个)空行
<?xml version='1.0' standalone='yes'?>

xslt不喜欢这样,它不会把xml解析成html。我知道这是问题所在,因为如果我通过编辑程序(如notepad)手动删除2(两)个空白行,转换就会完美地工作。我无法控制返回的xml数据的格式,因此我需要找到一种方法,在继续解析之前先删除这两行空白行。

这是我的xml(想象开头有两行空白行):

<?xml version='1.0' standalone='yes'?>
<FHAENTITYDATA FHAVersionID = '1.0'>  
<PROCESSSTATUS>
<ProcessStatusCode>Success</ProcessStatusCode>
<ProcessStatusMessage sCode = '1'>Returned 1 zip code record(s)</ProcessStatusMessage>
</PROCESSSTATUS> 
</FHAENTITYDATA>

这里是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>
<link rel="stylesheet" href="../css/fhac.css" type="text/css"/>
</head>
<body style="font-family:verdana;">
<div id="content">
<div id="fieldset">
<xsl:for-each select="//ProcessStatusCode">
  <tr><td><b><xsl:value-of select="."/></b></td></tr>
</xsl:for-each>
<xsl:for-each select="//ProcessStatusMessage">
  <tr><td><b><xsl:value-of select="."/></b></td></tr>
</xsl:for-each>
</table>
</div></div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

我的问题是,有没有办法在xslt之前或期间删除这些行头?

你的问题的答案是"不"。XML声明必须是XML解析器读取的第一件事,对于解析器来说,没有XML声明比在文件(/string/buffer/其他)的第一行中有XML声明要少得多。

你的问题的答案确实是一个修剪。确切的实现取决于您可以使用的其他工具(在本例中是php)。我建议您只删除XML声明之前的空行,而不是删除所有的空行,因为您可能希望保留文本元素中的空行。

这里应该可以工作:

preg_replace("/(^['r'n]*|['r'n]+)['s't]*['r'n]+/", "", $string);

它将简单地删除所有完全空白的行。你只需要将文件的内容放入$string