2

いくつかの XML ファイルを統合してマスター XML ファイルを生成する必要があります。ディスク上のどこかに別の子 XML ファイルが保存されている場合に実現できます。しかし、私の場合、子 XML ファイルは動的 XML データです。それらはどこにも保存されませんが、動的に生成されます。では、これらの子 XML データを挿入してマスター XML ファイルを生成するにはどうすればよいでしょうか。

私の入力は次のとおりです。

<root>
  <element id="1">
  </element>
  <element id="2">
  </element>
</root>

私の出力は次のようになります。

<root>
   <element id="1">
      <section>
         <record>12</record>
      </section>
   </element>
   <element id="2">
      <section>
          <input>menu</input>
      </section>
   </element>
</root>

上記の出力 XML data( <section><record>12</record></section>) では、PHP 変数から取得する必要があります。

4

3 に答える 3

0

これは古いスレッドですが、満足のいく答えはありません。最近、私は同様の状況に直面しましたが、解決策はこのような問題に適用するのに十分一般的であると信じています.

DOMNode基本的に、PHP と XSLT プロセッサはオブジェクト (パラメーターと戻り値)を介して通信します。したがって、DOMNodePHP を使用してオブジェクトを構築し、XSLT プロセッサの要求に応じてオブジェクトを返すことができます。

上記の例を考えると、次の XSLT になります。

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:php="http://php.net/xsl">
  <xsl:template match="/root">
    <root>
      <xsl:apply-templates select="element" />
    </root>
  </xsl:template>

  <xsl:template match="element">
    <element>
      <!-- Pass the selected id attributes to a PHP callback,
           then literally include the XML as returned from PHP.
           Alternatively, one could use xsl:apply-templates
           to further transform the result. -->
      <xsl:copy-of select="php:function('xslt_callback', @id)" />
    </element>
  </xsl:template>
</xsl:stylesheet>

また、PHP 関数 (この関数はregisterPHPFunctionsメソッドでエクスポートする必要があります [ php マニュアルを参照]) は次のようになります。

/**
 * @param  DOMAttr[]  $attr_set An array of DOMAttr objects,
 *                              passed by the XSLT processor.
 * @return DOMElement           The XML to be inserted.
 */
function xslt_callback ($attr_set) {
  $id = $attr_set[0]->value;
  return new DOMElement('section', $id); //whatever operation you fancy
}

次の XML が生成されます。

<root>
  <element>
    <section>1</section>
  </element>
  <element>
    <section>2</section>
  </element>
</root>

php 関数xslt_callbackは、選択された ID で好きなことを行うことができます。この例では、$attr_set選択した属性が常に 1 つだけ含まれていると想定しています。状況によっては、範囲または型のチェックを実行することをお勧めします。ただし、これは例のスケルトンを不必要に複雑にするだけです。

注: PHP から単純に XML 文字列を返すと、すべてのおよびに&lt;および&gt;タグが挿入されます。<>

于 2013-05-02T22:12:49.000 に答える
0

2 つの「動的」XML ドキュメントをパラメーターとして変換に渡す必要があります

各「動的ドキュメント」は、すでに XML ドキュメントとして解析されている必要があります (他の XSLT プロセッサ API には、たとえばXmlDocument.LoadXml()、文字列を取得して XML として解析し、(解析された) XML ドキュメントを作成するメソッドがあります)。

XSLT プロセッサーのドキュメントを読んで、外部パラメーターを変換に渡すために使用する API を確認してください。

于 2012-07-17T12:55:29.937 に答える