Сопоставление значения элемента XML с массивом элементов в целевом XML

У меня есть требование, когда у меня есть XML-файл, например:

<main>
    <Qnumber>10</Qnumber>
    <Qaddress>hyderabad</Qaddress>
    <Qratio>12:3</Qratio>
    <QGet>Getthevalue</QGet>
</main>

Эти значения должны быть сопоставлены с целевой схемой следующим образом:

У нас есть тег с именем от 1 до многих (от 1 до бесконечности):

<Additional properties>
    <property>
        <Name></Name>
        <Value></Value>
    </property>
</Additional properties>

Теперь мне нужно сопоставить это следующим образом:

<Additional properties>
    <property>
        <Name>Qnumber</Name>
        <Value>10</Value>
    </property>
    <property>
        <Name>Qaddress</Name>
        <Value>hyderabad</Value>
    </property>
    <property>
        <Name>Qratio</Name>
        <Value>12:3</Value>
    </property>
    <property>
        <Name>QGet</Name>
        <Value>Getthevalue</Value>
    </property>
</Additional properties>

У меня есть этот материал в XSLT. Может ли кто-нибудь помочь с этой конкретной концепцией. Спасибо


person srinivas kalyan    schedule 23.11.2016    source источник


Ответы (1)


Во-первых, у вас не может быть пробела в имени вашего XML-элемента. Таким образом, я заменил пробел на _.

Вот решение:

<?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" />

    <xsl:template match="main">
        <Additional_properties>
            <xsl:for-each select="./*">
                <xsl:if test="position() &lt; 5">
                    <property>
                        <xsl:element name="Name">
                            <xsl:value-of select="name()"/>
                        </xsl:element>
                        <xsl:element name="Value">
                            <xsl:value-of select="text()"/>
                        </xsl:element> 
                    </property>
                </xsl:if>
            </xsl:for-each> 
        </Additional_properties>
    </xsl:template>
</xsl:stylesheet>
person Maria Ivanova    schedule 23.11.2016
comment
Спасибо, и это сработает, если все значения будут приняты во внимание, и теперь проблема в том, что я сказал еще 5 тегов в xml, например ‹main› ‹Qnumber› 10 ‹/Qnumber› ‹Qaddress› hyderabad ‹/Qaddress› ‹ Qratio ›12: 3 ‹/Qratio› ‹QGet› Getthevalue ‹/QGet› ‹Qversion› 1.0 ‹/Qversion› ‹QVariable› 123 ‹/Qvariable› ‹QTag› 456 ‹/QTag› ‹Qchange› 1234/Qchange›‹ / main ›Итак, я хочу, чтобы в дополнительных свойствах были только первые 4 значения. Не могли бы вы мне помочь. - person srinivas kalyan; 24.11.2016
comment
Вы можете проверить значения с помощью xsl:if - person Maria Ivanova; 24.11.2016
comment
Не могли бы вы подробнее рассказать об этом? - person srinivas kalyan; 24.11.2016
comment
Я обновил свой ответ. По сути, вы проверяете, соответствует ли текущий узел в цикле условию. Это обработает только первые 4 узла. Однако, если вы хотите вместо этого указать имена узлов, вы можете проверить их имена, а не их положение и использование или в тестовом выражении. - person Maria Ivanova; 24.11.2016
comment
Большое спасибо за ответ, и вы можете сказать мне, если у меня нет указанного порядка, например, тегов в разных позициях - person srinivas kalyan; 24.11.2016
comment
Тогда вы можете сделать это, как я объяснил в своем предыдущем комментарии: test="name()='Qnumber' or name()='Qaddress' or ..." - person Maria Ivanova; 24.11.2016
comment
хорошо, тогда только одно условие if и / или для всех значений, которые необходимо передать в значение свойства, в порядке, правильно - person srinivas kalyan; 24.11.2016
comment
Извините, что снова беспокою вас, я не знаю, помещаю ли я match = main, я получаю сообщение об ошибке ---- Ошибка: ‹xsl: template match = /› и ‹xsl: template name = ...› и каково значение выберите =. / * - person srinivas kalyan; 24.11.2016
comment
. - текущий узел. * - это дикая карта. т.е. это означает выбор узла, который является дочерним по отношению к текущему узлу. Таким образом, for-each проходит через все прямые дочерние узлы под текущим узлом (который является основным, поскольку это то, что соответствует шаблону). Если вы добавляете что-то еще в XSLT и получаете эту ошибку, я бы посоветовал вам задать новый вопрос - с XSLT, который вы используете (все это), и с ошибкой, которую вы получаете. - person Maria Ivanova; 24.11.2016
comment
Большое тебе спасибо. Ваша помощь запомнится. На самом деле прямо сейчас я использую / для сопоставления с образцом - person srinivas kalyan; 24.11.2016
comment
Привет, Мария Делева, я добавил новый вопрос в ссылку .. не могли бы вы ответить на него .. stackoverflow.com/questions/40787013/xslt-mapping-using-foreach - person srinivas kalyan; 24.11.2016
comment
@ Мария ДелеваПроверьте вопрос stackoverflow.com/questions/40868419/ - person srinivas kalyan; 29.11.2016
comment
@ michael.hor257k не могли бы вы взглянуть на этот вопрос ... stackoverflow.com/questions/41178098/ - person srinivas kalyan; 16.12.2016
comment
не могли бы вы взглянуть на вопрос .... stackoverflow.com/questions/41178098/ - person srinivas kalyan; 16.12.2016