2016-04-26 3 views
0

Вход: два xml-файла. Первый имеет несколько полей, которые содержат соответствующие значения, но весь узел фактически пуст. Данные для этого узла содержатся во втором XML-файле.XSL заменяет весь узел данными из другого XML-файла

Выход: первый XML-файл, содержащий недостающие значения, взятые из второго поставляемого XML-файла.

Методология: необходимо использовать XSL-файл для выполнения задачи ввода отсутствующих значений в первом xml из соответствующего узла во втором xml.

Пример:

Главная Input.xml

<?xml version="1.0" encoding="UTF-16"?> 
<root> 
<data> a </data> 
<values> 
    <value>1</value> 
    <value>2</value> 
</values> 
<objects></objects> 
</root> 

Source_of_missing_info.xml

<?xml version="1.0" encoding="UTF-16"?> 
<root> 
<data> a </data> 
<values> 
    <value>1</value> 
    <value>2</value> 
</values> 
<objects> 
    <object>Car</object> 
    <object>Train</object> 
    <object>Ship</object> 
</objects> 
</root> 

Merger.xsl - это требуется.

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

<xsl:template match="/"> 
    <xsl:copy-of select="*"/> 
</xsl:template> 

    <xsl:variable name="lookup" select="document('input_missing.xml')" /> 

    <xsl:template match="objects"> 
      <xsl:copy-of select="$lookup" /> 
      <xsl:value-of select="text()" /> 
    </xsl:template> 

</xsl:stylesheet> 

Ожидаемый результат:

<?xml version="1.0" encoding="UTF-16"?> 
<root> 
<data> a </data> 
<values> 
    <value>1</value> 
    <value>2</value> 
</values> 
<objects> 
    <object>Car</object> 
    <object>Train</object> 
    <object>Ship</object> 
</objects> 
</root> 

Можно ли достичь желаемого преобразования путем изменения выше Merger.xsl? Что является ключом к решению?

ответ

1

Почему не просто:

<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:strip-space elements="*"/> 

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

<xsl:template match="objects"> 
    <xsl:copy-of select="document('input_missing.xml')/root/objects"/> 
</xsl:template> 

</xsl:stylesheet> 
+0

Это работает! Спасибо за документ '', я не смог найти эту синтаксическую опцию в любых примерах, которые я искал. – teodron

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