我在php中使用以下函数将xml文档加载到xslt文档中,输出xml,并将document.xml替换为单词docx:
$xmlDocument = new DOMDocument();
$xmlDocument->load('xml/' . $xmlfile);
$xsltDocument = new DOMDocument();
$xsltDocument->load($xsltFile);
$xsltProcessor = new XSLTProcessor();
$xsltProcessor->importStylesheet($xsltDocument);
所以我通常在XSLT文件中使用这个函数来提取一个XMLvar:
<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文档,因为无论我引起什么错误,都会导致整个事件的死亡。帮助
您确定有权访问XSLT2吗?默认情况下,PhP可能有XSLT1,除非您在某个地方连接了saxon的XSLT2引擎。在这种情况下,xsl:analyze-string
和replace()
不可用,并且您想要类似的东西
<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>
xsl:analyze-string
在这种情况下显得过于夸张。相反,假设您有XSLT2.0,我将使用一个regexp替换:
<xsl:value-of select="replace(PORT_REQUEST/WICIS/REMARKS,
'('d{3})('d{3})('d{4})', '$1-$2-$3')" />
这将任何10位数字解析为3-3-4块,并在它们之间用连字符输出。
然而,正如@DavidCarlisle所指出的,XSLT2.0通常不能与PHP一起使用。因此xsl:analyze-string
和replace()
都不可用。看看他的回答。