Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php SenseSevel中用xslt替换xml元素的同义词?_Php_Xslt_Simplexml - Fatal编程技术网

在php SenseSevel中用xslt替换xml元素的同义词?

在php SenseSevel中用xslt替换xml元素的同义词?,php,xslt,simplexml,Php,Xslt,Simplexml,我正在用PHP为xml格式(SimpleXML)的元数据编制索引。在这个过程中(以及以后的一些时候),我想根据元素的属性/位置/名称重写(和删除)元素。我想xslt很适合这样做,但由于性能问题,我有点害怕。所以最好形成一个regexp作为规则并直接用php编辑?对于这些替代方案,我不喜欢在帮助我的情况下找不到操纵语法 那你是怎么做的,或者你会怎么做? 谢谢你的帮助, Robert我怀疑在一般情况下,用正则表达式表示XML文档中任意深度的节点的删除/添加/替换操作是可能的(更不用说同时满足其他条件

我正在用PHP为xml格式(SimpleXML)的元数据编制索引。在这个过程中(以及以后的一些时候),我想根据元素的属性/位置/名称重写(和删除)元素。我想xslt很适合这样做,但由于性能问题,我有点害怕。所以最好形成一个regexp作为规则并直接用php编辑?对于这些替代方案,我不喜欢在帮助我的情况下找不到操纵语法

那你是怎么做的,或者你会怎么做? 谢谢你的帮助,
Robert

我怀疑在一般情况下,用正则表达式表示XML文档中任意深度的节点的删除/添加/替换操作是可能的(更不用说同时满足其他条件,例如基于属性、名称空间、深度、文本节点)。

这就解释了为什么你找不到这样的正则表达式

另一方面,任何这样的操作对于XSLT来说都是微不足道的,人们在半分钟内写出解决方案,却忘记了这个“问题”,因为还有更重要的事情要做

对于记录,下面是元素重命名操作(名为
a
的艾米元素重命名为
h
):


例如应用于此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>

生成所需的正确结果

<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>


Regex不擅长处理XML。使用XSLT,为什么性能会令人恐惧?因为if必须转换为DOM对象,因为它经常被调用(不止一次),而且是因为simplexml/DOM交换中的错误。。所以,如果我在simpleXML中迭代,将节点的一部分转换为DOM并转换回(使用导入函数),迭代将被取消,因为对象在某种程度上不同。好问题,+1。请参阅我的答案,了解完整、简单、简短且简单的通用XSLT解决方案。每当需要对XML文档进行转换时,不使用XSLT来解决这个问题将是一个严重的错误。过去我已经在simpleXML中使用xslt了。正如我在上面的评论中提到的,当在更高层次结构中迭代时,用xslt交换DOM中的节点是不稳定的。。您可能是对的,xslt非常有效。@rokdd:xslt被设计成XML转换的语言。它提供了轻松和优雅,同时是非常强大的。绝对是一种在工具集中占有一席之地的工具。