2012-03-07 53 views
1

我使用下面的函数在PHP中的XML文档加载到一个XSLT文件,输出XML,并且在字的docx更换document.xml中:编辑字符串在XSLT分析串

$xmlDocument = new DOMDocument(); 
$xmlDocument->load('xml/' . $xmlfile); 

$xsltDocument = new DOMDocument(); 
$xsltDocument->load($xsltFile); 

$xsltProcessor = new XSLTProcessor(); 
$xsltProcessor->importStylesheet($xsltDocument); 

所以我通常使用此功能在XSLT文件拉一个XML VAR:

<xsl:value-of select="PORT_REQUEST/WICIS/REMARKS" /> 

然而,由于XML瓦尔直接加载到XSLT文件,我不能用我的友好PHP REG EXP的,和我奋力极大努力弄清楚如何使这项工作。我只需要将XML var(1112223333格式的电话号码)放入111-222-3333格式即可。

这是我有:

  <xsl:analyze-string select="PORT_REQUEST/NUMBER_PORTABILITY/ADMINISTRATIVE/ATN" 
       regex="(^.{3})|(.{4}$)|((?<=(^.{3}))(.*?)(?=(.{4}$)))"> 

        <xsl:matching-substring> 
        <xsl:number value="regex-group(1)" format="001"/> 
        <xsl:number value="regex-group(2)" format="001"/> 
        <xsl:number value="regex-group(3)" format="0001"/> 
        </xsl:matching-substring> 
       </xsl:analyze-string> 

而且它不工作,我得到什么,而不是重新格式化的电话号码变量是一个空的XML文档,任何错误,我引起杀死的整个事情。 帮助

+0

好问题,到目前为止,但只要你键入“它不工作,”你要问:有我告诉正是导致我的预期,而我得到了什么结果呢?在这种情况下,后者似乎缺失。 – LarsH 2012-03-07 22:04:38

+0

结果我希望:“我只需要将XML var(电话号码为1112223333格式)并将其放入111-222-3333格式。”我每次都得到一个空的xml文件。它只是杀死了整个事情,我得到的唯一错误信息是“必须至少有一个根节点” – user1255749 2012-03-07 22:10:45

回答

2

您确定您有权访问XSLT2吗?默认情况下,PhP很可能具有XSLT1,除非您将撒克逊的XSLT2引擎连接到某处。在这种情况下,xsl:analyze-stringreplace()不可,并且要像

<xsl:for-each select="PORT_REQUEST/NUMBER_PORTABILITY/ADMINISTRATIVE/ATN"> 
<xsl:value-of select="substring(.,1,3)"/> 
<xsl:text>-</xsl:text> 
<xsl:value-of select="substring(.,4,3)"/> 
<xsl:text>-</xsl:text> 
<xsl:value-of select="substring(.,7)"/> 
</xsl:for-each> 
+0

是的,最后!谢谢,您可能对导致错误的XSLT版本正确,因为xsl:analyze-string和replace()都会导致致命错误。我总是喜欢简单的解决方案 – user1255749 2012-03-07 22:51:56

+2

那么为什么你说你有一个空文件,而不是告诉我们你有一个致命的错误?当你得到错误的信息时,很难提供帮助。 – 2012-03-07 23:40:57

+0

@MichaelKay:OP甚至没有检查错误... – 2012-03-08 03:10:40

1

xsl:analyze-string对于这种情况是矫枉过正的。相反,假设你已经XSLT 2.0,我会用一个正则表达式替换:

<xsl:value-of select="replace(PORT_REQUEST/WICIS/REMARKS, 
      '(\d{3})(\d{3})(\d{4})', '$1-$2-$3')" /> 

这解析任何10位号码为3-3-4块,并与他们之间的连字符输出。但是正如@大卫卡莱尔指出的那样,XSLT 2.0通常不适用于PHP。所以既没有xsl:analyze-string也没有replace()可用。看到他的答案。

+0

谢谢,在这里测试:http://gskinner.com/RegExr/它可以工作,但是我的输出docx文件(其中替换的document.xml文件)只保留了它应该的三分之一的内容,但仍然存在一些错误。 – user1255749 2012-03-07 22:43:53

+0

刚刚确认替换函数导致错误,仍然可以回答 – user1255749 2012-03-07 22:47:16

+0

@David指出PHP不提供XSLT 2.0,我忽略了这一点。你有没有忽略告诉我们一些致命的错误? – LarsH 2012-03-08 06:04:42