我目前正在重构批量的XML文档,并且该过程涉及将xml重构为新修订的DTD Schema。由于使用了新的DTD,最初使用的许多元素要么改变用途,重新嵌套在其他元素中,要么完全删除。 以下示例是针对DTD验证时的无效xml文档。为了加快重构XML的过程,我认为可能XQuery脚本或XSLT转换可能会有所帮助。但是,我对这两者都没有经验,而且我仍然是XML的新手。有人可以向我解释XQuery,XSLT或Xpath在重构这些文档时最相关的语言。
无效的XML:
<PartsDoc foo=”” baa=”” bar=”” revno=”” docno=”” >
<PartsDocInfo>
<repairlvl level=”shop” />
<title id=”123”> Foo Electrical Control Box </title>
</PartsDocInfo>
<Parts.Category>
<figure id=”123” >
<title id=”123”> Control Box Panels </title>
<subfig id=”123”>
<graphic img=”foo.jpg” />
</subfig>
<!- - everything above is valid, the below portion is not - ->
<parts.item>
<callout id=”123” config=”123” label=”1” />
<mrs service=”shop” sc=”” mc=”” rec=”” />
<nsn niin=”00-123-4567”> 4444-00-123-5467</nsn>
<cageno>12345</cageno>
<partno>12345</partno>
<name/>
<desc id=”123” > Bolt 1/2inch </desc>
<qty>4</qty>
<parts.item>
</parts.category>
期望的输出:
<PartsDoc foo=”” baa=”” bar=”” revno=”” docno=”” >
<PartsDocInfo>
<repairlvl level=”shop” />
<title id=”123”> Foo Electrical Control Box </title>
</PartsDocInfo>
<Parts.Category>
<figure id=”123” >
<title id=”123”> Control Box Panels </title>
<subfig id=”123”>
<graphic img=”foo.jpg” />
</subfig>
<parts.item>
<callout id=”123” config=”123” label=”1” />
<qty>4</qty>
<mrs service=”shop” sc=”” mc=”” rec=”” />
<nsn>
<fsc>4444</fsc>
<niin>00-12-5467
</nsn>
<partno>12345</partno>
<cageno>12345</cageno>
<name/>
<desc id=”123” > Bolt 1/2inch </desc>
<parts.item>
</parts.category>
*请注意
<qty>
已移动 *注意<partno>
已移动 * note<nsn>
不包括内容已排序的子元素
此外,某些实例包含<uoc>
个<desc>
元素作为孩子嵌套在其中。
<desc>
bolt 1/2inch
<uoc>XYZ</uoc>
</desc>
<uoc>
实际上应该在<callout>
之后,
<qty>
对XSLT样式表或XQuery脚本的任何帮助都会非常感激,并简要解释为什么选择一种语言而不是另一种语言。我目前正在使用Oxygen 17 XML编辑器
答案 0 :(得分:2)
当输出的大部分与输入相同时,XSLT通常更符合要求。一般原则是编写一个样式表,其中包含递归复制元素的一般规则,然后为要执行不同操作的元素添加规则。
在XSLT 3.0中,通用规则是:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
... other code goes here ...
</xsl:transform>
在早期版本中,它是:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*">
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
... other code goes here ...
</xsl:transform>
您可以编写重新排序parts.item的模板规则:
<xsl:template match="parts.item">
<parts.item>
<xsl:copy-of select="callout"/>
<xsl:copy-of select="qty"/>
<xsl:copy-of select="mrs"/>
<nsn>
<fsc><xsl:value-of select="substring-before(nsn, '-')"/></fsc>
<niin><xsl:value-of select="nsn/@niin"/></niin>
</nsn>
<xsl:copy-of select="partno"/>
<xsl:copy-of select="cageno"/>
<xsl:copy-of select="name"/>
<xsl:copy-of select="desc"/>
</parts.item>
将这些放在一起,以下是XSLT 2.0样式表:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="parts.item">
<parts.item>
<xsl:copy-of select="callout"/>
<xsl:copy-of select="qty"/>
<xsl:copy-of select="mrs"/>
<nsn>
<fsc><xsl:value-of select="substring-before(nsn, '-')"/></fsc>
<niin><xsl:value-of select="nsn/@niin"/></niin>
</nsn>
<xsl:copy-of select="partno"/>
<xsl:copy-of select="cageno"/>
<xsl:copy-of select="name"/>
<xsl:copy-of select="desc"/>
</parts.item>
</xsl:template>
</xsl:transform>
应用于以下源文档:
<PartsDoc foo="" baa="" bar="" revno="" docno="" >
<PartsDocInfo>
<repairlvl level="shop" />
<title id="123"> Foo Electrical Control Box </title>
</PartsDocInfo>
<Parts.Category>
<figure id="123" >
<title id="123"> Control Box Panels </title>
<subfig id="123">
<graphic img="foo.jpg" />
</subfig>
<!-- everything above is valid, the below portion is not -->
<parts.item>
<callout id="123" config="123" label="1" />
<mrs service="shop" sc="" mc="" rec="" />
<nsn niin="00-123-4567"> 4444-00-123-5467</nsn>
<cageno>12345</cageno>
<partno>12345</partno>
<name/>
<desc id="123" > Bolt 1/2inch </desc>
<qty>4</qty>
</parts.item>
</figure>
</Parts.Category>
</PartsDoc>
产生以下输出:
<?xml version="1.0" encoding="UTF-8"?>
<PartsDoc foo="" baa="" bar="" revno="" docno="">
<PartsDocInfo>
<repairlvl level="shop"/>
<title id="123"> Foo Electrical Control Box </title>
</PartsDocInfo>
<Parts.Category>
<figure id="123">
<title id="123"> Control Box Panels </title>
<subfig id="123">
<graphic img="foo.jpg"/>
</subfig>
<parts.item>
<callout id="123" config="123" label="1"/>
<qty>4</qty>
<mrs service="shop" sc="" mc="" rec=""/>
<nsn>
<fsc> 4444</fsc>
<niin>00-123-4567</niin>
</nsn>
<partno>12345</partno>
<cageno>12345</cageno>
<name/>
<desc id="123"> Bolt 1/2inch </desc>
</parts.item>
</figure>
</Parts.Category>
</PartsDoc>