我想将具有特定模式的XML文档转换为另一个XML文档,为其提供特定的不同模式。
举一个例子,输入可以如下:
<?xml version="1.0" encoding="UTF-8"?>
<Abcd field1="0" field2="3" field3="1" field4="_sometext" field5="text" field6="Helloworld" />
<Efgh _id="2790" size="2">
<i>2771</i>
<i>2781</i>
</Efgh>
此示例的相应输出为:
<?xml version="1.0" encoding="UTF-8"?>
<field name="Abcd"> field1="0" field2="3" field3="1" field4="_sometext" field5="text" field6="Helloworld" </field>
<field name="Efgh"> _id="2790" size="2"
<i>2771</i>
<i>2781</i>
</field>
只有两种类型的标签:
我不确定如何尝试这种转换(Regex?XSLT?)。
如果只有表单1的标签(如Abcd),在bash中使用sed可以完成我认为的工作,但是对于表单2的标签,我不知道如何继续。
编辑:我使用sed编写了一个小管道,将表单1的行转换为正确的对应部分,它的工作原理如下:
cat input1.xml | sed "s/ * /\"> /" | sed "s/</<field name=\"/" | sed "s,/>,</field>,"
但是如何继续?
答案 0 :(得分:0)
我打算在这里猜一下;给出以下示例输入:
<强> XML 强>
<root>
<Abcd field1="0" field2="3" field3="1" field4="_sometext" field5="text" field6="Helloworld" />
<Efgh _id="2790" size="2">
<i>2771</i>
<i>2781</i>
</Efgh>
</root>
以下样式表:
XSLT 1.0
<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:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root/*">
<field name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</field>
</xsl:template>
</xsl:stylesheet>
将导致:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<field name="Abcd" field1="0" field2="3" field3="1" field4="_sometext" field5="text" field6="Helloworld"/>
<field name="Efgh" _id="2790" size="2">
<i>2771</i>
<i>2781</i>
</field>
</root>
对我来说似乎更有可能是所需的输出。