2012-04-01 91 views
1

这是一个问题关于概念继承XML文件,并修改数值

我有一个XML文件,姑且称之为基地

<base id="default"> 
    <tags> 
     <tag>tag_one</tag> 
     <tag>tag_two</tag> 
     <tag>tag_three</tag> 
    </tags> 
    <data> 
     <data_a>blue</data_a> 
     <data_b>3</data_b> 
    </data> 
</base> 

我想要做的是能在另一个文件扩展这个XML,修改个别属性。例如,我想继承文件,使一个新的具有不同data/data_a节点:

<base id="green" import="default"> 
    <data> 
     <data_a>green</data_a> 
    </data> 
</base> 

到目前为止,这是很简单的,它取代了旧的data/data_a用新的。我甚至可以添加一个新节点:

<base id="ext" import="default"> 
    <moredata> 
     <data>extended version</data> 
    </moredata> 
</base> 

而且还是很简单。当我想要删除节点或处理XML列表时(如tags节点),问题就出现了。

我应该如何名单上引用一个特定的指数?我想这样做是这样的:

<base id="diffList" import="default"> 
    <tags> 
     <tag index="1">this is not anymore tag_two</tag> 
    </tags> 
</base> 

以及用于删除一个节点/数组索引:

<base id="deleting" import="default"> 
    <tags> 
     <tag index="2"/> 
    </tags> 
    <data/> 
</base> 

<!-- This will result in an XML containing these values: --> 

<base> 
    <tag>tag_one</tag> 
    <tag>tag_two</tag> 
</base> 

但我不是很满意我的解决方案。我对XSLT或其他XML转换工具一无所知,但我认为以前有人必须这样做。

关键目标,我正在寻找的是减轻手工编写的XML(包括底座和“扩展”)。

我除了XML开放的新的解决方案,如果他们很容易手工编写。

感谢您的阅读。

回答

1

下面可以指导你。 XSLT可能会将一个XML转换为另一个XML。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

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

    <xsl:template match="data_a"> 
     <data_a>green</data_a> 
    </xsl:template> 

    <xsl:template match="tags/tag[1]"/> 

</xsl:stylesheet> 

上述三个模板的说明:
(1)复制所有节点和属性
(2),但改变DATA_A节点
(3)和内不执行任何操作的第一标签元件(任何)标签元素。

我希望这将帮助你改变你的XML。