Слияние двух исходных документов XML с XSLT - PullRequest
2 голосов
/ 03 февраля 2010

XML-файл можно иметь 1000 - 6000 форм; XML-файл два может иметь от одного до 100 или более. Я хочу заменить любую идентичную форму в файле один на файл два. Если он существует в файле 2, но отсутствует в файле 1, я хочу добавить его в файл 1. После объединения файлов я хочу запустить его с моим XSLT. Я использую таблицу стилей 2.0 и синтаксический анализатор Saxon.

Файл 1:

<Forms><br> <Form name="fred" date="10/01/2008"/><br> <Form name="barney" date="12/31/2009"/><br> <Form name="wilma" date="12/31/2010"/><br> </Forms>

Файл 2:

<Forms><br> <Form name="barney" date="01/31/2010"/><br> <Form name="betty" date="6/31/2009"/><br> </Forms>

Объединенный файл должен выглядеть так:

<Forms><br> <Form name="fred" date="10/01/2008"/><br> <Form name="barney" date="01/31/2010"/><br> <Form name="wilma" date="12/31/2010"/><br> <Form name="betty" date="6/31/2009"/><br> </Forms>

1 Ответ

7 голосов
/ 03 февраля 2010

Если поддержание порядка документов не является приоритетом:

<xsl:variable name="forms1" select="document('forms1.xml')/Forms/Form" />
<xsl:variable name="forms2" select="document('forms2.xml')/Forms/Form" />

<xsl:variable name="merged" select="
  $forms1[not(@name = $forms2/@name)] | $forms2
" />

<xsl:template match="/">
  <xsl:apply-templates select="$merged" />
</xsl:template>

<xsl:template match="Form">
  <!-- for the sake of the example; you can use a more specialized template -->
  <xsl:copy-of select="." />
</xsl:template>

Если поддержание порядка документов является приоритетом по какой-либо причине ...

<xsl:template match="/">
  <!-- check values of file 1 sequentially, and replace them if needed -->
  <xsl:for-each select="$forms1">
    <xsl:variable name="this"  select="." />
    <xsl:variable name="newer" select="$forms2[@name = $this/@name]" />
    <xsl:choose>
      <xsl:when test="$newer">
        <xsl:apply-templates select="$newer" />
      </xsl:when>
      <xsl:otherwise>
        <xsl:apply-templates select="$this" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:for-each>
  <!-- append any values from file 2 that are not in file 1 -->
  <xsl:apply-templates select="$forms2[not(@name = $forms1/@name)]" />
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...