2012-02-07 21 views
0

試圖XSLTProcessor中,但它打破了,如果我嘗試添加屬性元素與兒童PHP有哪些最新/最先進的xslt解析器?

XSLTProcessor中:: transformToXml()[xsltprocessor.transformtoxml]: 的xsl:屬性:無法添加屬性,如果孩子的元素已經將 添加到元素中。

我會補充說,這個XSLT + XML正在客戶端正確解析。
是否有任何PHP版本/解析器知道如何處理這樣的問題?

UPD:我使用XSL是我們連接到的第三方,我無法控制我從那裏/他們獲得的東西。

回答

0

XSLTProcessor是PHP的最佳選擇。 儘量避免模板中有問題的語法。如果我理解正確你的任務,你可以嘗試這樣的事:

<xsl:template match="XPathOfYourElement"> 
    <someTag someAttribute='<xsl:value-of select="someXpath"/>'> 
     <xsl:apply-templates/> 
    </someTag> 
</xsl:template> 

您也可以使用php4 xslt functions,但它是moveton。

另一種方式是使用非php的控制檯實用程序通過shell_exec()進行xslt轉換,但這也是一種糟糕的方式。

+0

可能希望將其更改爲'',除非您想使用'xsl:attribute'。 – 2012-02-07 18:54:35

0

這也是其他解析器(MSXML,.NET System.XML)的問題。
嘗試重新排列XSL中的訂單。你必須明確你想要什麼元素。

下面是一個示例XML/XSL

<xml> 
    <e>One</e> 
    <e>Two</e> 
    <e>Three</e> 
</xml> 

您可以添加這兩個元素具有以下XSL

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
<xsl:output method="xml" indent="yes"/> 
<xsl:template match="/"> 
<xml> 
    <xsl:for-each select='/xml/e'> 
     <xsl:element name='e'> 
      <xsl:attribute name='newatt'>New attribute</xsl:attribute> 
      <xsl:value-of select='.'/> 
     </xsl:element> 
     <xsl:element name='newlement'> 
      <xsl:attribute name='newatt'>New attribute in new element</xsl:attribute> 
      new element value 
     </xsl:element> 
    </xsl:for-each> 
</xml> 
</xsl:template> 
</xsl:stylesheet> 

創建此

<?xml version="1.0"?> 
<xml> 
    <e newatt="New attribute">One</e> 
    <newlement newatt="New attribute in new element"> 
         new element value 
       </newlement> 
    <e newatt="New attribute">Two</e> 
    <newlement newatt="New attribute in new element"> 
         new element value 
       </newlement> 
    <e newatt="New attribute">Three</e> 
    <newlement newatt="New attribute in new element"> 
         new element value 
       </newlement> 
</xml> 
+0

XSL是我們連接的第三方,我無法控制我從那裏得到的東西。 – 2012-02-07 17:45:05

+0

哦,這是一個問題。告訴第三方他們的XSL已經損壞。或者,如果您使用MSXML,則在元素失敗後添加屬性,但不會出現錯誤(該屬性不存在)。你需要從PHP獲取MSXML,但我不認爲這很困難(如果你在MS平臺上)。祝你好運。 – 2012-02-07 17:51:48

1

當你添加屬性的屬性元素添加子元素之後,允許XSLT 1.0處理器忽略這些屬性或報告錯誤。您似乎有兩個處理器選擇了不同的選項。無論哪種方式,代碼被破壞,需要修復。 (XSLT 2.0需要報告錯誤。)