我正在尝试将XML文件从一种格式更改为另一种格式,并且不知道如何为其编写脚本。有人可以帮帮忙吗? 源文件如下所示:
<Record>
<FieldValue fieldName="rapportage_nihil" fieldValue="false" fieldValueIsNull="false" fieldValueNatural="false"/>
<FieldValue fieldName="periode" fieldValue="2009-23-31" fieldValueIsNull="false" fieldValueNatural="2009-10-31 00:23:23"/>
<FieldValue fieldName="formulierid" fieldValue="9001HK1V10" fieldValueIsNull="false" fieldValueNatural="9001HK1V10"/>
<FieldValue fieldName="versie" fieldValue="1" fieldValueIsNull="false" fieldValueNatural="1"/>
<FieldValue fieldName="frequentie" fieldValue="M" fieldValueIsNull="false" fieldValueNatural="M"/>
<FieldValue fieldName="variant_type" fieldValue="Landen" fieldValueIsNull="false" fieldValueNatural="Landen"/>
<FieldValue fieldName="value" fieldValue="5F" fieldValueIsNull="false" fieldValueNatural="5F"/>
<FieldValue fieldName="post_value" fieldValue="0.00" fieldValueIsNull="false" fieldValueNatural="1.037E-4"/>
<FieldValue fieldName="cube" fieldValue="c01" fieldValueIsNull="false" fieldValueNatural="c01"/>
<FieldValue fieldName="rij" fieldValue="r_24_100_1_000_0" fieldValueIsNull="false" fieldValueNatural="r_24_100_1_000_0"/>
<FieldValue fieldName="kolom" fieldValue="c_2250_SPU" fieldValueIsNull="false" fieldValueNatural="c_2250_SPU"/>
</Record>
<Record>
<FieldValue fieldName="rapportage_nihil" fieldValue="false" fieldValueIsNull="false" fieldValueNatural="false"/>
<FieldValue fieldName="periode" fieldValue="2009-23-31" fieldValueIsNull="false" fieldValueNatural="2009-10-31 00:23:23"/>
<FieldValue fieldName="formulierid" fieldValue="9001HK1V10" fieldValueIsNull="false" fieldValueNatural="9001HK1V10"/>
<FieldValue fieldName="versie" fieldValue="1" fieldValueIsNull="false" fieldValueNatural="1"/>
<FieldValue fieldName="frequentie" fieldValue="M" fieldValueIsNull="false" fieldValueNatural="M"/>
<FieldValue fieldName="variant_type" fieldValue="Landen" fieldValueIsNull="false" fieldValueNatural="Landen"/>
<FieldValue fieldName="value" fieldValue="5F" fieldValueIsNull="false" fieldValueNatural="5F"/>
<FieldValue fieldName="post_value" fieldValue="0.00" fieldValueIsNull="false" fieldValueNatural="1.037E-4"/>
<FieldValue fieldName="cube" fieldValue="c01" fieldValueIsNull="false" fieldValueNatural="c01"/>
<FieldValue fieldName="rij" fieldValue="r_24_108_0_000_0" fieldValueIsNull="false" fieldValueNatural="r_24_108_0_000_0"/>
<FieldValue fieldName="kolom" fieldValue="c_2250_SPU" fieldValueIsNull="false" fieldValueNatural="c_2250_SPU"/>
</Record>
<Record>
<FieldValue fieldName="rapportage_nihil" fieldValue="false" fieldValueIsNull="false" fieldValueNatural="false"/>
<FieldValue fieldName="periode" fieldValue="2009-23-31" fieldValueIsNull="false" fieldValueNatural="2009-10-31 00:23:23"/>
<FieldValue fieldName="formulierid" fieldValue="9001HK1V10" fieldValueIsNull="false" fieldValueNatural="9001HK1V10"/>
<FieldValue fieldName="versie" fieldValue="1" fieldValueIsNull="false" fieldValueNatural="1"/>
<FieldValue fieldName="frequentie" fieldValue="M" fieldValueIsNull="false" fieldValueNatural="M"/>
<FieldValue fieldName="variant_type" fieldValue="Landen" fieldValueIsNull="false" fieldValueNatural="Landen"/>
<FieldValue fieldName="value" fieldValue="5F" fieldValueIsNull="false" fieldValueNatural="5F"/>
<FieldValue fieldName="post_value" fieldValue="0.00" fieldValueIsNull="false" fieldValueNatural="1.6049E-4"/>
<FieldValue fieldName="cube" fieldValue="c01" fieldValueIsNull="false" fieldValueNatural="c01"/>
<FieldValue fieldName="rij" fieldValue="r_06_000_1_010_0" fieldValueIsNull="false" fieldValueNatural="r_06_000_1_010_0"/>
<FieldValue fieldName="kolom" fieldValue="c_2250_SPU" fieldValueIsNull="false" fieldValueNatural="c_2250_SPU"/>
</Record>
这是我需要的格式:
<bestand registratienummer="123">
<rapportage nihil="false" periode="2009-23-31" formulierid="9001HK1V10" versie="1" frequentie="M">
<variant type="Landen" value="5F" />
<post value="0.00" cube="c01" rij="r_24_100_1_000_0" kolom="c_2250_SPU" />
</rapportage>
<rapportage nihil="false" periode="2009-23-31" formulierid="9001HK1V10" versie="1" frequentie="M">
<variant type="Landen" value="5F" />
<post value="0.00" cube="c01" rij="r_24_108_0_000_0" kolom="c_2250_SPU" />
</rapportage>
<rapportage nihil="false" periode="2009-23-31" formulierid="9001HK1V10" versie="1" frequentie="M">
<variant type="Landen" value="5F" />
<post value="0.00" cube="c01" rij="r_06_000_1_010_0" kolom="c_2250_SPU" />
</rapportage>
</bestand>
非常感谢!
答案 0 :(得分:4)
XSLT就是为了这个目的而制作的。您可以将任何定义良好的XML文件转换为任何其他纯文本格式,包括不同的XML结构。得到例如xsltproc,写一个脚本,你就完成了。
如果您需要首先学习XSLT,这里有一个很好的起点:http://www.w3schools.com/xsl/(本教程给出了转换为XHTML的示例,但您只需使用目标XML标记而不是XHTML标记... )。
这可能是一个很好的脚本开始(抱歉,但我没有时间在这里给你一个完整的脚本):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" encoding="utf-8" />
<xsl:template match="/">
<bestand registratienummer="123">
<apply-templates select="//Record"/>
</bestand>
</xsl:template>
<xsl:template match="Record">
<xsl:variable name="nihil" select="FieldValue[@fieldName='rapportage_nihil']/@fieldValue"/>
<!-- add more variable lookups here. you need XPath for that. -->
<rapportage nihil="{$nihil}" periode="{$periode}">
<!-- add more output here -->
</rapportage>
</xsl:template>
</xsl:stylesheet>
您可以提供xsltproc此样式表和源XML文档,它会为您提供新的XML文件。也许你需要确保你的源XML文件是明确定义的,即包含一个根元素。你的例子看起来不像是一个,你可能需要用任意元素包围它。
详细说明XSLT和脚本:想象一下,你有两个指针。一个在XSLT脚本中,一个在XML源文件中。 XSLT就是“应用模板”,它总是使用最接近匹配的模板(将模板视为某种功能)。
首先,最接近的匹配是根元素,因此XSLT指针将在模板中以match="/"
开始。 XML指针位于XML源文档的根元素(别名“tag”)中。任何以<{1}}开头的不的元素都将被视为输出元素。因此,首先,xsltproc将输出xsl:
元素。
然后XSLT指针进一步发现<bestand>
选择匹配<apply-templates>
的所有元素(双斜杠表示“在任何深度”)。对于每个//Record
元素,它将“调用”匹配模板。这里最接近的匹配是<Record>
。
因此,XSLT指针将跳转到模板,即指向第一个<xsl:template match="Record">
的XML指针。然后声明一个变量(<Record>
),其中包含记录中的一些信息,使用XPath表达式从XML指针中选择更深入到源文档的XML结构中。 XPath表达式说:“从元素nihil
中选择,其属性为FieldValue
,值为fieldName
,属性值为'rapportage_nihil'
”(将其想象为SQL XML数据的WHERE子句;属性在此处以fieldValue
为前缀。
您需要为输出文档中所需的每个信息复制,粘贴和更改该行。然后评估输出元素@
,用每个变量(例如<rapportage>
)替换上面用{$nihil}
设置的各自值。您需要以与<xsl:variable>
元素相同的方式在<rapportage>
元素内添加元素。然后模板就在它的末尾,下一个<rapportage>
将通过模板。