我在php中使用以下函数将xml doc加载到xslt文档,输出xml,并替换docx中的document.xml:
$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 :(得分:2)
您确定可以访问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>
答案 1 :(得分:1)
xsl:analyze-string
对于这种情况来说太过分了。相反,假设您有XSLT 2.0,我将使用单个regexp替换:
<xsl:value-of select="replace(PORT_REQUEST/WICIS/REMARKS,
'(\d{3})(\d{3})(\d{4})', '$1-$2-$3')" />
将任何10位数字解析为3-3-4块,并在它们之间用连字符输出。
然而,正如@David Carlisle指出的那样,PHP通常不提供XSLT 2.0。因此xsl:analyze-string
和replace()
都不可用。看他的答案。