2014-08-27 2 views
0

Я надеюсь, что кто-то может указать мне в правильном направлении. Я попытался изолировать свой вопрос в простой форме, как я могу себе представить. В разборе файла:Как лучше объединить данные с xslt

<?xml version="1.0" encoding="UTF-8"?> 
<Master> 
    <Info> 
     <Info1></Info1> 
     <Info2></Info2> 
     <Info3></Info3> 
     <Offer> 
      <Id>1a</Id> 
      <Field1></Field1> 
      <Field2></Field2> 
      <Field3></Field3> 
     </Offer> 
     <Offer> 
      <Id>3a</Id> 
      <Field1></Field1> 
      <Field2></Field2> 
      <Field3></Field3> 
     </Offer> 
    </Info> 
</Master> 

Мне нужно сравнить его с подобным файлом:

<?xml version="1.0" encoding="UTF-8"?> 
<Old> 
    <Info> 
     <Info1></Info1> 
     <Info2></Info2> 
     <Info3></Info3> 
     <Offer> 
      <Id>1a</Id> 
      <Field1></Field1> 
      <Field2></Field2> 
      <Field3></Field3> 
     </Offer> 
     <Offer> 
      <Id>2a</Id> 
      <Field1></Field1> 
      <Field2></Field2> 
      <Field3></Field3> 
     </Offer> 
    </Info> 
</Old> 

Использование поля в качестве ключа, я хотел бы, чтобы произвести следующее с:

<?xml version="1.0" encoding="UTF-8"?> 
<Merged> 
    <Info> ##from Master 
     <Info1></Info1> 
     <Info2></Info2> 
     <Info3></Info3> 
     <Offer>  ##from Master 
      <Id>1a</Id> 
      <Field1></Field1> 
      <Field2></Field2> 
      <Field3></Field3> 
      <Action>Update</Action> 
     </Offer> 
     <Offer>  ##from Old 
      <Id>2a</Id> 
      <Field1></Field1> 
      <Field2></Field2> 
      <Field3></Field3> 
      <Action>Delete</Action> 
     </Offer> 
     <Offer>  ##from Master 
      <Id>3a</Id> 
      <Field1></Field1> 
      <Field2></Field2> 
      <Field3></Field3> 
      <Action>Add</Action> 
     </Offer> 
    </Info> 
</Merged> 

1a соответствует как Мастеру, так и Старому, поэтому он становится операцией обновления, 2а существует в Старом, но не Мастер, он становится операцией удаления, а 3a существует только в Мастере, поэтому он становится операцией добавления. Данные и данные всегда поступают от Мастера (кроме, конечно, в случае удаления).

Заранее благодарим за любую помощь.

+0

Прежде чем написать свой собственный алгоритм слияния, попробуйте [Oliver Becker's] (https://www2.informatik.hu-berlin.de/~obecker/XSLT/merge/merge.xslt.html). Сообщите нам, если он производит требуемый результат. –

+0

Просьба указать XSLT 1.0 или 2.0. –

+0

Спасибо за предложение. Я смотрю на это, и я, конечно, не эксперт, но, похоже, для этого потребуются немалые доработки, чтобы принести нужные мне результаты. Я смотрел на A intersect B (мое обновление), A, кроме B (мое добавление), и B, кроме A (мое удаление), как возможность, но я не уверен, как применить его еще – user3570518

ответ

0

Это кажется довольно простой (или, возможно, я неправильно требование):

XSLT 2,0

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

<xsl:variable name="master" select="document(base-uri())" /> 
<xsl:variable name="old" select="document('old.xml')"/> 

<xsl:key name="offer" match="Offer" use="Id" /> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Info"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     <xsl:apply-templates select="$old/Old/Info/Offer[not(key('offer', Id, $master))]" mode="delete"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Offer"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     <Action> 
      <xsl:choose> 
       <xsl:when test="key('offer', Id, $old)">Update</xsl:when> 
       <xsl:otherwise>Add</xsl:otherwise> 
      </xsl:choose> 
     </Action> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Offer" mode="delete"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     <Action>Delete</Action> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

Здесь предполагается, что файл Master.xml является один обрабатываемый.

+0

Решение может на самом деле быть простым, но я все еще участвую. Сегодня у меня не хватит времени, но завтра обязательно посмотрите на свое решение и обновите его. Еще раз спасибо, это, безусловно, оценено. – user3570518

+0

В приведенном примере я смог заставить его работать. – user3570518

Смежные вопросы