Замена синонимов для элементов xml с xslt в php смысл? - PullRequest
0 голосов
/ 19 июня 2011

Я индексирую метаданные в формате xml (SimpleXML) с помощью PHP. В процессе (а иногда и позже) я хочу переписать (и удалить) элементы по их атрибутам / позиции / имени. Я думаю, что xslt хорош для этого, но мне немного страшно из-за производительности. Так что может быть лучше сформировать регулярное выражение как правило и редактировать напрямую с помощью php? Для этой альтернативы мне не нравится, что я не могу найти синтаксис манипуляции, чтобы помочь мне в дальнейшем.

Так как ты это сделаешь? Спасибо за вашу помощь, Роберт

1 Ответ

2 голосов
/ 19 июня 2011

Я сомневаюсь, что в общем случае можно с помощью регулярного выражения выразить операцию удаления / добавления / замены для узла на произвольной глубине в документе XML (не говоря уже о одновременном выполнении других условий, таких какпо атрибутам, пространству имен, глубине, текстовым узлам).

Это объясняет, почему вы не можете найти такой RegEx.

С другой стороны, любая такая операциятривиально с XSLT и один пишет решение за полминуты и забывает об этой «проблеме», потому что есть действительно более важные дела.

Для записи, ниже, переименование элементаоперация (элемент amy с именем a переименован в h):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="a">
  <h>
   <xsl:apply-templates/>
  </h>
 </xsl:template>
</xsl:stylesheet>

при применении, например, к этому документу XML :

<a>
    <b>
        <c>
            <d/>
            <a>
                <b>
                    <e>
                        <f>
                            <c>
                                <d>
                                    <a/>
                                </d>
                            </c>
                        </f>
                    </e>
                </b>
            </a>
        </c>
    </b>
</a>

желаемый, правильный результат выдается :

<h>
   <b>
      <c>
         <d/>
         <h>
            <b>
               <e>
                  <f>
                     <c>
                        <d>
                           <h/>
                        </d>
                     </c>
                  </f>
               </e>
            </b>
         </h>
      </c>
   </b>
</h>
...