Как использовать XSLT для генерации одного выходного XML-файла путем чтения и обработки из нескольких входных XML-файлов
Друзья,
Я новичок в XSLT. Пожалуйста, помогите получить приведенную ниже логику. Я использую unix машину
Из приведенного ниже 3 входного XML-файла нужно добавить значение поля count, используя xslt, и сгенерировать вывод с добавленным значением в поле count.
Input XML 1
<topic>
<topicName>Billing</topicName>
<property>
<make>HONDA</make>
<Model>ACCORD</Model>
</property>
<count>10</count>
</topic>
<topic>
<topicName>Billing</topicName>
<property>
<make>TOYOTO</make>
<Model>CAMRY</Model>
</property>
<count>20</count>
</topic>
<topic>
<topicName>Billing</topicName>
<property>
<make>NISSAN</make>
<Model>ALTIMA</Model>
</property>
<count>30</count>
</topic>
Входной XML 2
<topic>
<topicName>Billing</topicName>
<property>
<make>HONDA</make>
<Model>ACCORD</Model>
</property>
<count>100</count>
</topic>
<topic>
<topicName>Billing</topicName>
<property>
<make>TOYOTO</make>
<Model>CAMRY</Model>
</property>
<count>200</count>
</topic>
<topic>
<topicName>Billing</topicName>
<property>
<make>NISSAN</make>
<Model>ALTIMA</Model>
</property>
<count>300</count>
</topic>
Входной XML 3
<topic>
<topicName>Billing</topicName>
<property>
<make>HONDA</make>
<Model>ACCORD</Model>
</property>
<count>1000</count>
</topic>
<topic>
<topicName>Billing</topicName>
<property>
<make>TOYOTO</make>
<Model>CAMRY</Model>
</property>
<count>2000</count>
</topic>
<topic>
<topicName>Billing</topicName>
<property>
<make>NISSAN</make>
<Model>ALTIMA</Model>
</property>
<count>3000</count>
</topic>
Из приведенного выше 3 входного XML-файла необходимо добавить значение счетчика с помощью xslt и сгенерировать вывод с добавленным значением для поля счетчика
Выходной XML:
<topic>
<topicName>Billing</topicName>
<property>
<make>HONDA</make>
<Model>ACCORD</Model>
</property>
<count>1110</count>
</topic>
<topic>
<topicName>Billing</topicName>
<property>
<make>TOYOTO</make>
<Model>CAMRY</Model>
</property>
<count>2220</count>
</topic>
<topic>
<topicName>Billing</topicName>
<property>
<make>NISSAN</make>
<Model>ALTIMA</Model>
</property>
<count>3330</count>
</topic>
Заранее спасибо
2 ответа
Читайте на document()
функция и (для 1.1) doc()
функция.
В 1.1 читайте дальше xsl:for-each-group
а также deep-equal()
,
В версиях 1.0 и 1.1 читайте sum()
,
Вы можете читать в файлах, используя коллекцию (синтаксис, используемый в примере, специфичен для Saxon 9):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output indent="yes"/>
<xsl:param name="file-pattern" select="'topic*.xml'"/>
<xsl:template name="main">
<xsl:for-each-group select="collection(concat('.?select=', $file-pattern))//topic" group-by="concat(property/make, '|', property/Model)">
<xsl:copy>
<xsl:copy-of select="topicName, property"/>
<count>
<xsl:value-of select="sum(current-group()/count)"/>
</count>
</xsl:copy>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
Запустите Saxon 9, используя -it:main
начать с этого шаблона под названием main
,