2012-02-07 3 views
0

はXSLTProcessorをしようとしていたが、私は子供PHPには最新の/最も高度なxsltパーサーはありますか?

で要素に属性を追加してみた場合、それは壊れる

XSLTProcessor :: transformToXml()[xsltprocessor.transformtoxml]: XSL:属性:子供の場合要素に属性を追加することはできません要素にすでに が追加されています。

この非常にXSLT + XMLがクライアント側で正しく解析されていることを追加します。
このような問題の処理方法を知っているPHPバージョン/パーサーはありますか?

UPD:私はXSLを使用していますが、私たちが接続するサードパーティーです。そこから得るものは何も制御できません。

答えて

0

PHPではXSLTProcessorが最適です。 テンプレートで問題のある構文を避けるようにしてください。

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

はまた、あなたが php4 xslt functionsを使用することができますが、それはmovetonだ:私が正しくあなたの仕事を理解していれば、あなたはこのような何かを試すことができます。

もう1つの方法は、shell_exec()を介してxslt変換に非PHPコンソールユーティリティを使用することですが、それも悪い方法です。

+0

'xsl:attribute'を使用しない限り、' someTag someAttribute = "{someXpath}"> 'に変更したいことがあります。 –

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は私たちが接続しているサードパーティーです。 –

+0

ああ、それは問題です。サードパーティにXSLが壊れていることを伝えます。また、MSXMLを使用する場合は、要素の後に属性を追加しますが、エラーは発生しません(属性は存在しません)。 PHPからMSXMLを入手する必要がありますが、MSプラットフォームであればそれほど難しくないと思います。がんばろう。 –

1

を作成します。要素を子に追加した後、XSLT 1.0プロセッサは属性を無視するか、 、またはエラーを報告します。異なるオプションを選択した2つのプロセッサがあるようです。いずれにせよ、コードは壊れており修正が必要です。 (XSLT 2.0ではエラーを報告する必要があります)

関連する問題