在不改变架构的情况下保持XML DRY

时间:2013-12-06 02:59:09

标签: xml dry jscript

我们正在使用第三方XML架构,用于根据这些表单上的表单和选项卡对GUI布局进行编码。这是由第三方应用程序读取的,我们几乎没有控制权(也就是没有控制权)。我们还获得了一个有限的MS JScript接口来处理按键事件,因此可以合理地猜测第三方应用程序也是某种JScript引擎。

我们正在修改GUI布局,为一些表单添加一组选项卡。修改后的xml看起来像:

<forms>
  <form name="form1">
    <tab name="3rd party tab A">
      ...
    </tab>
    <tab name="Our standard tab">
      ...
    </tab>
  </form>
  <form name="form2">
    <tab name="3rd party tab B">
      ...
    </tab>
    <tab name="Our standard tab">
      ...
    </tab>
  </form>
</forms>

有没有办法引用重复的“我们的标准标签”来保持干燥?下面的内容是理想的:

<forms>
  <form name="form1">
    <tab name="3rd party tab A">
      ...
    </tab>
    <tab name="Our standard tab">
      ...
    </tab>
  </form>
  <form name="form2">
    <tab name="3rd party tab B">
      ...
    </tab>
    <?!@reference="/forms/form[@name='form1']/tab[@name='Our standard tab']">
  </form>
</forms>

Nb我们无法控制阅读应用程序,即解决方案必须利用标准或Microsoft JScript DOM XML表示法而不是其他模式。

2 个答案:

答案 0 :(得分:1)

您可以使用external entities

创建一个文件std-tab.xml:

<tab name="Our standard tab">
  ...
</tab>

通过将XML包含在需要的位置来保持XML干燥:

<?xml version="1.0" ?>
<!DOCTYPE forms [
<!ENTITY std-tab SYSTEM "std-tab.xml">
]>
<forms>
  <form name="form1">
    <tab name="3rd party tab A">
      ...
    </tab>
    &std-tab;
  </form>
  <form name="form2">
    <tab name="3rd party tab B">
      ...
    </tab>
    &std-tab;
  </form>
</forms>

注意:此方法无需在工具链中添加任何工具即可使用;外部实体将按照兼容的XML解析器工作。另一方面,XSLT需要另一种工具,但提供了更灵活的处理选项。

答案 1 :(得分:1)

您可以使用XSLT

此XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <forms>
      <form name="form1">
        <tab name="3rd party tab A">
          ...
        </tab>
        <xsl:call-template name="std-tab"/>
      </form>
      <form name="form2">
        <tab name="3rd party tab B">
          ...
        </tab>
        <xsl:call-template name="std-tab"/>
      </form>
    </forms>
  </xsl:template>

  <xsl:template name="std-tab">
    <tab name="Our standard tab">
      ...
    </tab>
  </xsl:template>

</xsl:stylesheet>

针对任何XML文件运行(<dummy/>会这样做)将产生XML的WET版本:

<?xml version="1.0" encoding="UTF-8"?>
<forms>
   <form name="form1">
      <tab name="3rd party tab A">
          ...
        </tab>
      <tab name="Our standard tab">
      ...
    </tab>
   </form>
   <form name="form2">
      <tab name="3rd party tab B">
          ...
        </tab>
      <tab name="Our standard tab">
      ...
    </tab>
   </form>
</forms>

注意:使用此方法可以比外部实体方法获得更多功能。您可以进一步抽象表单定义,并从那里实际提取参数和结构,而不是使用虚拟输入XML文件。但是,XSLT方法确实需要另一个可能尚未在您的工具链中的工具;外部实体将按照兼容的XML解析器工作。