2014-12-04 78 views
-4

我需要你的大力帮助,我总是迷失在这个问题中,我一直在Google上搜索,但没有什么能帮助我。当我找到一些解决方案时,它不起作用.....帮助我请求:/用PHP或XSLT编辑xml文件

用PHP或XSLT请求编辑Thx。

输入:

<SHOP> 
    <SHOPITEM> 
     <PRODUCTNAME>Table</PRODUCTNAME> 
     <DESCRIPTION>slaklasdk askdalsd dsasd</DESCRIPTION> 
     <URL>http://www.google.com/</URL> 
     <IMGURL>http://www.google.com/</IMGURL> 
     <PRICE>79</PRICE> 
     <CATEGORIES> 
      <CATEGORY>Work, table</CATEGORY> 
     </CATEGORIES> 
     <MOTIVES> 
      <MOTIVE>Brown oak</MOTIVE> 
     </MOTIVES> 
     <SIZES> 
      <SIZE> 
       <SIZEID>38626</SIZEID> 
       <SIZENAME>uni</SIZENAME> 
       <STOREPIECES>12</STOREPIECES> 
      </SIZE> 
     </SIZES> 
</SHOPITEM> 
<SHOPITEM> 
     <PRODUCTNAME>Book</PRODUCTNAME> 
     <DESCRIPTION>asdasdasdawra asdaseasd</DESCRIPTION> 
     <URL>http://www.google.com/</URL> 
     <IMGURL>http://www.google.com/</IMGURL> 
     <PRICE>79</PRICE> 
     <CATEGORIES> 
      <CATEGORY>Book, Magazine</CATEGORY> 
     </CATEGORIES> 
     <MOTIVES> 
      <MOTIVE>Black with blue stars</MOTIVE> 
     </MOTIVES> 
     <SIZES> 
      <SIZE> 
       <SIZEID>38626</SIZEID> 
       <SIZENAME>uni</SIZENAME> 
       <STOREPIECES>0</STOREPIECES> 
      </SIZE> 
     </SIZES> 
    </SHOPITEM> 

我需要:

1)删除<URL> and <IMGURL>

2)<PRODUCTNAME>重命名<title>

3)<CATEGORIES>删除和重命名<CATEGORY> on <ctg_0>

4)<MOTIVE>合并与<DESCRIPTION>和删除<MOTIVES>,<MOTIVE>

5)删除<SIZES>, <SIZE> and <SIZEID>之后<SIZENAME><pieces>

合并与 <DISCRIPTION>并添加新的元件 <unit>0</unit>和重命名 <STOREPIECES>

输出:

<SHOP> 
    <SHOPITEM> 
     <title>Table</title> 
     <DESCRIPTION>slaklasdk askdalsd dsasd, Motive:Brown oak, size:uni</DESCRIPTION> 
     <PRICE>79</PRICE> 
     <ctg_0>Book, Magazine</ctg_0> 
     <pieces>12</pieces> 
     <unit>0</unit> 
    </SHOPITEM> 
    <SHOPITEM> 
     <title>Book</title> 
     <DESCRIPTION>asdasdasdawra asdaseasd, Motive:Black with blue stars, size:uni</DESCRIPTION> 
     <PRICE>79</PRICE> 
     <ctg_0>Book, Magazine</ctg_0> 
     <pieces>0</pieces> 
     <unit>0</unit> 
    </SHOPITEM> 
</SHOP> 
+1

**我需要**不是一个问题,这不是一个编码服务。如果你被困在**特定**问题上,请询问*那*。 – 2014-12-04 23:45:51

+0

对不起,但我的英语不好,所以我用直言不讳,你不必非常积极。 – Proender 2014-12-05 18:52:57

+0

你的英语与它无关。 http://stackoverflow.com/help/how-to-ask不要将简洁与侵略性混为一谈。 – 2014-12-05 19:05:09

回答

1

了解XSL。快速崩溃课程: xsl首先匹配最不通用的匹配项,因此如果您有*和URL规则的规则,它将应用URL而不是*的规则。 。是当前节点。 *都是当前节点的子节点。 text()是当前节点下的所有文本,或匹配中的单个文本节点。 @ *是当前节点的所有属性。 名称(。)是当前节点的名称。

因此,该递归拷贝(零星)每个节点/文本/文件中的属性:

<xsl:template match="*"> 
    <xsl:element name="{name(.)}"> 
     <xsl:apply-templates select="*|@*|text()"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="@*|text()"> 
    <xsl:copy-of select='.'/> 
</xsl:template> 

现在添加更具体的比赛为那些你想改变。如果你想删除一个节点:

<xsl:template match="URL|IMGURL"/><!-- Do nothing, don't copy it --> 

请记住,更具体的匹配首先来。重命名节点,将{name(。)}(当前节点的名称)替换为您要更改的节点。

这应该让你开始,其余的由你决定。

+0

“*此递归地复制(零碎)文件中的每个节点/文本/属性*”实际上,它只复制元素,属性和文本节点,而不是*每个*节点。其他节点,如名称空间,注释和处理指令不会被复制。 (更确切地说,它甚至不会复制元素 - 它会创建具有相同名称的新元素 - 这里**有区别。)请参阅:http://en.wikipedia.org/wiki/Identity_transform# Using_XSLT – 2014-12-05 06:27:21

+0

我不是很精确,我很有帮助。 – Mike 2014-12-05 06:40:49

+0

我不会去那里。 – 2014-12-05 06:46:27