在XSLT中使用analyze-string编辑字符串

时间:2012-03-07 21:45:19

标签: php xml regex xslt

我在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文档,因为我造成的任何错误都会导致整个事情失败。 帮助

2 个答案:

答案 0 :(得分:2)

您确定可以访问XSLT2吗?默认情况下,PhP可能有XSLT1,除非你已经在某个地方连接了saxon的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>

答案 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-stringreplace()都不可用。看他的答案。