2012-03-07 59 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