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