0

我需要为 10,000 多个文件更新 XML。

我是一名新手程序员,所以如果可能的话,我更愿意使用可以开箱即用的东西(现有解决方案?)。如果没有,我不害怕学习和尝试新事物。我正在大学学习一门课程(编程逻辑)来弄湿我的脚,但这当然不会提供立竿见影的效果。

所有文件都在它们自己的基于序列号的目录中。每个文件名为 83_XYZETC.xml

这些 XML 文件中的每一个都有两个标签/内容,需要搜索并删除所有实例。

例子:

<mediaFile>
content 123
</mediaFile>

<image>
image info 123
</image>

然后我还需要在另一个标签中重新插入不同的标签/内容。例子:

                  <track>
Need to insert>>  <action>UPDATE</action>
                  extra stuff etc 
                  more stuff
                  even more
                  </track>

最后,我需要在标签中输入一串文本,但在最后。
例子:

<right type="labelDownload">Y</right>
</track>

我会很感激任何建议。首选 Windows 平台。谢谢!

4

2 回答 2

3

XSLT 允许您以与英语描述非常相似的形式表达您的转换规则。

你从一个模板规则开始,它说“默认情况下,当你点击一个元素时,复制它并处理它的子元素”:

<xsl:template match="*">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

您需要有关“删除此元素”的 mediaFile 和图像元素的规则(即,当您遇到它时,不输出任何内容):

<xsl:template match="mediaFile | image"/>

对于 track 元素,如果我理解正确的话,您想在开头和结尾添加一些标准内容:

<xsl:template match="track">
  <xsl:copy>
    <action>UPDATE</action>
    <xsl:apply-templates/>
    <right type="labelDownload">Y</right>
  </xsl:copy>
</xsl:template>

这就是样式表的全部内容,除了样板 xsl:stylesheet 元素将其全部包装起来。

然后您需要将其应用于您的 10000 个输入文档。您可以使用 ant 执行此操作,但其他人会使用 shell 脚本执行此操作,或者还有 David Lee 的 xmlsh,它是一种特殊的类似 shell 的 XML 处理脚本语言,或者您可以更进取并使用 XProc。或者您可以编写一个小的 Java 应用程序。这真的取决于你最喜欢什么。但是,如果您不想再学习另一种语言,您也可以在 XSLT 2.0 中完成,尽管它有点依赖于处理器。使用 Saxon,您可以添加模板规则:

<xsl:template name="main">
  <xsl:for-each select="collection('.?select=*.xml')">
    <xsl:result-document href="{tokenize(document-uri(.), '/')[last()]">
      <xsl:apply-templates/>
    </xsl:result-document>
  </xsl:for-each>
</xsl:template>

然后,在安装了 Saxon 之后,您只需在当前目录是包含 XML 文件的目录下运行它:

java net.sf.saxon.Transform -xsl:stylesheet.xsl -it:main -o:../output/result.xml
于 2013-03-19T08:33:08.923 回答
0

你也看过 XProc 吗?

于 2013-03-22T12:04:30.217 回答