2013-07-05 3 views
0

У меня есть два XML-файла, которые мне нужно объединить вместе (XML1 и XML2). Мне нужно условно добавить контент из XML2 в XML1, исходя из того, является ли атрибут отрицательным или положительным.Условно копировать содержимое из внешнего XML-файла

Ex. XML1

<containers> 
    <basket1> 
    </basket1> 
    <basket2> 
    </basket2> 
</containers> 

Ex. XML 2

<fruit> 
    <apple attr="1"/> 
    <apple attr="-1"/> 
</fruit> 

Ex. Выход

<containers> 
    <basket1> 
     <apple attr="1"> 
    </basket1> 
    <basket2> 
     <apple attr="-1"/> 
    </basket2> 
</containers> 

Как вы можете видеть, я не хочу, чтобы изменить структуру XML1 в принять, чтобы добавить содержимое на основе значения «ATTR».

Я уверен, что есть хорошее решение, но я рисую пробелы о том, как скомбинировать кусочки и кусочки. Любая помощь приветствуется! Приветствия!

+0

Вы знакомы с Xpath? на каком языке вы работаете (c/C++/C#/java и т. д.)? edit: просто увидел тег, поэтому вы хотите сделать это только с xslt? –

+0

@ Ron.B.I Я бы хотел использовать XSLT, но это будет 1 шаг в серии преобразований, выполняемых в Java-приложении. Если Java может повысить функциональность, это нормально. Отредактировано, чтобы сказать, что я использую Saxon 9 в качестве парсера. Я безразличен между XSLT 1.0 или 2.0. Все, что работает лучше всего. – Jeff

+0

Если вы хотите сделать это в Java, я могу вам помочь, я незнакомый с парсером Saxon 9, однако, вы знакомы с Xpath/Xquery? –

ответ

3

Непонятно, сколько общего это должно быть - так может быть, это не совсем то, что вам нужно.

<?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:variable name="fruit" select="document('XML2.xml')/fruit" /> 

    <xsl:template match="/containers"> 
     <containers> 
      <xsl:apply-templates select="node()[1]"> 
       <xsl:with-param name="type" select="'positive'" /> 
      </xsl:apply-templates> 
      <xsl:apply-templates select="node()[2]"> 
       <xsl:with-param name="type" select="'negative'" /> 
      </xsl:apply-templates>  </containers> 
    </xsl:template> 

    <xsl:template match="node()"> 
     <xsl:param name="type" /> 
     <xsl:copy> 
      <xsl:choose> 
       <xsl:when test="$type = 'positive'"> 
        <xsl:copy-of select="$fruit/*[@attr &gt;= 0]" /> 
       </xsl:when> 
       <xsl:when test="$type = 'negative'"> 
        <xsl:copy-of select="$fruit/*[@attr &lt; 0]" /> 
       </xsl:when> 
      </xsl:choose> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

Я ожидаю, что XML1 будет входным файлом, XML2 загружается в переменную. Должно быть сделано некоторое улучшение, например, проверка, действительно ли в атрибуте номер и т. Д.

+0

+1, работал над подобным ответом. –

+0

Я получил эту работу для меня. Спасибо! Как я могу обеспечить, чтобы все атрибуты в корзине1 и корзина2 также копировались? бросает ошибки для меня. – Jeff

+0

Nvm о бит атрибута. Я получил работу. Ответ принят! – Jeff

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