在XSLT中使用分析字符串编辑字符串


Editing string with analyze-string in XSLT

我在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-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>

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