#xml #xslt
#xml #xslt
Вопрос:
Я пытаюсь скопировать данные из file2 в file1 с помощью преобразования xsl. Я могу скопировать данные, но моя проверка xsd завершается ошибкой в результирующем xml-файле. Пожалуйста, помогите мне скопировать данные правильным образом. Вот мой код: file1.xml:
<Org>
<Security xmlns:saxon="http://saxon.sf.net" />
</Org>
file2.xml:
<Profile>
<Policy>Policy1</Policy>
<PolicyValue>Value1</PolicyValue>
</Profile>
result.xml:
<Org>
<Security xmlns:saxon="http://saxon.sf.net">
<Security>
<Profile>
<Policy>Policy1</Policy>
<PolicyValue>Value1</PolicyValue>
</Profile>
</Security>
</Security>
</Org>
Желаемый результат:
<Org>
<Security xmlns:saxon="http://saxon.sf.net">
<Profile description="SecurityProfile">
<Policy description="SecurityProfile">Policy1</Policy>
<PolicyValue description="SecurityProfile">Value1</PolicyValue>
</Profile>
</Security>
</Org>
Вот код из моего xsl-файла:
<xsl:template match="*[local-name()='Org']/*[local-name()='Security']]">
<xsl:variable name="description" select="document($lookup)/Entity/@description" />
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:copy>
<xsl:copy-of select="document($lookup)/Profile" />
</xsl:copy>
<xsl:apply-templates select="node()" />
</xsl:copy>
</xsl:template>
В моем выходном файле есть вложенный элемент безопасности, который вызывает сбой проверки. Может ли кто-нибудь, пожалуйста, помочь мне в устранении проблемы. Также мне нужно рекурсивно добавить значение атрибута ко всем копируемым элементам. Я смог установить переменную для чтения атрибута из файла поиска. Мне не удалось установить значения атрибутов для дочерних узлов.
Спасибо за помощь.
Ответ №1:
Рассмотрите возможность перехода по дереву первого xml с шаблонами для организации и безопасности, а в последнем шаблоне запустите несколько <xsl:for-each>
на внешних узлах:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/Org">
<xsl:copy>
<xsl:apply-templates select="Security"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Security">
<xsl:copy>
<xsl:for-each select="document('SecurityProfile2.xml')/Profile">
<xsl:copy>
<xsl:attribute name="description">SecurityProfile</xsl:attribute>
<xsl:for-each select="document('file2.xml')/Profile/*">
<xsl:element name="{local-name()}">
<xsl:attribute name="description">SecurityProfile</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Комментарии:
1. Спасибо за быстрый ответ. «Безопасность» находится в двух разных местах xml-файла, которые необходимо преобразовать, чтобы в одном из них были дочерние элементы. Приведенное выше решение удаляет дочерние узлы во втором случае и копирует узлы из file2, как мы можем сохранить дочерние узлы безопасности и скопировать данные из file2. Когда мы копируем элемент из file2 с помощью <xsl:element name=»{local-name()}»>, он не получает требуемые атрибуты, как мы можем их получить? Кроме того, атрибуты элемента Security удалены. Возможно ли добавить некоторые атрибуты к элементу безопасности. Спасибо за помощь.
2. В данный момент я нахожусь вдали от своего компьютера, но я был почти уверен, что результат этого решения соответствует опубликованному вами желаемому результату. Возможно, вы работаете с другими XML-данными?
3. Для обеспечения безопасности я взял первый узел из xml-файла, у которого есть атрибут и нет дочернего узла. Я опубликовал это в качестве желаемого результата. Когда я применил предоставленный вами код к xml-файлу, я заметил, что он удалил дочерний узел из второго узла безопасности. Извините за путаницу. Спасибо за помощь.
4. Пожалуйста, проверьте желаемый результат. Существует только один узел безопасности , и я только что проверил свой запуск, и он отобразился именно так, как вы хотели.