0

我们有一个复杂的 Adob​​e LiveCycle XDP (XFA) 用于带有 XML 数据模型的评估师申请表(默认一个,没什么特别的)。还有另一个 XDP 具有相同的 Application Form,相同的布局,但具有不同的模型和 XML 结构。第二种形式的 XML 结构基于我不熟悉的格式,但我可以理解其中的内容。

第一个 XML 是普通的 XML,直截了当。

第二个 XML 有多个嵌套部分,字段名称在标签元素的属性中指定。图像在附件部分中指定,并且是来自相关标签元素的引用。

以下是第一个 XML 的示例:

<app_rep1>
  <NEW_primaryform>Some-primary-form</NEW_primaryform>
  <NEW_TITLE_PHOTO>SamplePhotoLabel1</NEW_TITLE_PHOTO>
  <NEW_CITY>Toronto</NEW_CITY>
  <NEW_Stage>Stage Value</NEW_Stage>
  <NEW_GS_AGE>23</NEW_GS_AGE>
  <NEW_POOL_X>Nice Pool</NEW_POOL_X><NEW_PHOTO1>/9j/4AAQSkZJRgABAAEASABIAAD//gAfTEVBRCBUZWNobm9sb2dpZXMgSW5jLiBWMS4wMQD/2wCE
bla...bla...bla
  </NEW_PHOTO1>
</app_rep1>

以下是第二个 XML 的示例:

<app_rep2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.1">
  <appraisal>
    <configuration>
      <primaryform>Some-primary-form</primaryform>
      <versioninfo>
        <acifileversion>123</acifileversion>
        <collectionversion>1.2.3.4</collectionversion>
        <collection>Report Pro</collection>
        <platform>Desktop Platform</platform>
      </versioninfo>
    </configuration>
    <data>
      <form name="photo1" primary="false">
        <section type="other" number="0" name="section_name1">
          <tag name="TITLE_PHOTO">SamplePhotoLabel1</tag>
          <tag name="LINE_PHOTO">SamplePhotoDescription1</tag>
        </section>
        <tag name="PHOTO1">../../../attachments/attachment[@key='267463fa-0073-4c10-83d6-fd8141641b72']</tag>
      </form>
      <form name="Some-primary-form" primary="true">
        <section type="other" number="0" name="OPTIONS">
          <tag name="OPT_TYPE_OF_APPRAISAL">Appraisal Type Value</tag>
        </section>
        <section type="subject" number="0" name="SUBJECT">
          <tag name="CITY">Toronto</tag>
          <tag name="STATE">Stage Value</tag>
          <tag name="GS_AGE">23</tag>
          <tag name="POOL_X">Nice Pool</tag>
        </section>
     </form>
    </data>
    <attachments>
      <attachment type="photo" label="" key="267463fa-0073-4c10-83d6-fd8141641b72">
        <image>
          <binary format="jpeg">/9j/4AAQSkZJRgABAAEASABIAAD//gAfTEVBRCBUZWNobm9sb2dpZXMgSW5jLiBWMS4wMQD/2wCE
bla...bla...bla
          </binary>
        </image>
      </attachment>
    </attachments>
  </appraisal>
</app_rep2>

如您所见,我想将第二个 XML 转换为看起来像第一个 XML。

我想我需要先编写 XSLT。然后,我需要将第二个 XML 导入到第一个 XDP 中,并在导入时应用 XSLT。

我在思考正确的方向吗?

你能帮助实现我的目标吗?我不确定该怎么做。

问题:

  1. 如何开发 XSLT?

  2. 如何在将第二个 XML 与第一个 XDP 合并时应用 XSLT?除了使用 Acrobat,我还能做什么?如何使用 Adob​​e LiveCycle Process Management 做到这一点?

  3. 如何执行字段名称从 XML 1 到 XML 2 的映射?有1000多个字段。我可以在 Excel 文件(field_name_1,field_name_2)中准备对列表,但是如何使用列表作为输入来应用查找/替换?因此,第 1 步将使用错误的字段名称应用转换,然后第 2 步将应用查找/替换。

任何帮助,将不胜感激。

谢谢,塔雷克

4

1 回答 1

1

关于问题的第一部分,您可以使用此 XSLT-1.0 样式表从 XML 中简单地提取值。该NEW_PHOTO1元素的问题在于,XPath 的动态评估只能在 XSLT-3.0 中使用该xsl:evaluate函数进行(并且 IIRC,您甚至需要 Saxon 的商业版本或支持它的其他处理器)。而且我不知道您提到的扩展库。

但是,如果您可以硬编码基本路径/app_rep2/appraisal/attachments/attachment,则可以将元素中的键与tag元素的键属性相匹配attachment。这并不优雅,但可能会根据您的整个场景为您省去麻烦。

<?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" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="app_rep2">
        <app_rep1>
            <NEW_primaryform><xsl:value-of select="appraisal/configuration/primaryform" /></NEW_primaryform>
            <NEW_TITLE_PHOTO><xsl:value-of select="appraisal/data/form[@name='photo1']/section/tag[@name='TITLE_PHOTO']" /></NEW_TITLE_PHOTO>
            <NEW_CITY><xsl:value-of select="appraisal/data/form[@name='Some-primary-form']/section[@type='subject']/tag[@name='CITY']" /></NEW_CITY>
            <NEW_Stage><xsl:value-of select="appraisal/data/form[@name='Some-primary-form']/section[@type='subject']/tag[@name='STATE']" /></NEW_Stage>
            <NEW_GS_AGE><xsl:value-of select="appraisal/data/form[@name='Some-primary-form']/section[@type='subject']/tag[@name='GS_AGE']" /></NEW_GS_AGE>
            <NEW_POOL_X><xsl:value-of select="appraisal/data/form[@name='Some-primary-form']/section[@type='subject']/tag[@name='POOL_X']" /></NEW_POOL_X>  
            <xsl:variable name="key" select='substring-before(substring-after(appraisal/data/form[@name="photo1"]/tag[@name="PHOTO1"],"@key=&apos;"),"&apos;")' />
            <NEW_PHOTO1><xsl:value-of select="/app_rep2/appraisal/attachments/attachment[@type='photo' and @key=$key]/image/binary" /></NEW_PHOTO1>            
        </app_rep1>
    </xsl:template>

</xsl:stylesheet>

输出匹配您的第一个文件。如何将其与 Adob​​e 集成 - 我不知道...

于 2019-07-27T23:56:13.607 回答