繁体   English   中英

将XML文档转换为另一个XML模式

[英]Transforming a XML document into another XML schema

我想将具有特定模式的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>

标签只有两种类型:

  1. 像Abcd一样,具有可变数量的字段(field1到fieldN)
  2. 像Efgh这样的人,也总是有一些<i> someText </ i>子标签。 (字符'i'总是在那里使用)。

我不知道如何尝试这样的转换(Regex?XSLT?)。

如果只有表单1的标签(如Abcd),在bash中使用sed可以完成我认为的工作,但是使用表单2的标签,我不知道如何继续。

编辑:我使用sed写了一个小管道,它将表单1的行转换为正确的对应物,它的工作原理如下:

cat input1.xml | sed "s/ * /\"> /" | sed "s/</<field name=\"/" | sed "s,/>,</field>,"

但是如何继续?

我想在这里猜一下; 给出以下示例输入:

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>

对我来说似乎更有可能是所需的输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM