Я пытаюсь скопировать данные из файла2 в файл1 с помощью преобразования xsl. Я могу скопировать данные, но моя проверка xsd не удалась в получающемся XML-файле. Вот мой код:
file1.xml:
<Org>
<Security xmlns:saxon="http://saxon.sf.net" />
</Org>
<Org>
<Security xmlns:saxon="http://saxon.sf.net">
<Access Privileges>
<Access Rules>Rule1</Access Rules>
</Access Privileges>
</Security>
</Org>
file2.xml:
<AccessProfile>
<Policy description="SecurityProfile">Policy1</Policy>
<PolicyValue description="SecurityProfile">Value1</PolicyValue>
</AccessProfile>
result.xml:
<Org>
<Security>
<Access>
<AccessProfile>
<Policy>Policy1</Policy>
<PolicyValue>Value1</PolicyValue>
</AccessProfile>
</Access>
</Security>
<Org>
</Org>
<Security>
<Access>
<AccessProfile>
<Policy>Policy1</Policy>
<PolicyValue>Value1</PolicyValue>
</AccessProfile>
</Access>
</Security>
</Org>
Желаемый вывод:
<Org>
<Security xmlns:saxon="http://saxon.sf.net" newAttr="Attr1">
<Access>
<AccessProfile description="SecurityProfile">
<Policy description="SecurityProfile">Policy1</Policy>
<PolicyValue description="SecurityProfile" vocabulary="simple">Value1</PolicyValue>
</AccessProfile>
</Access>
</Security>
</Org>
<Org>
<Security xmlns:saxon="http://saxon.sf.net" newAttr="Attr1">
<Access Privileges>
<Access Rules>Rule1</Access Rules>
</Access Privileges>
<Access>
<AccessProfile description="SecurityProfile">
<Policy description="SecurityProfile">Policy1</Policy>
<PolicyValue description="SecurityProfile" vocabulary="simple">Value1</PolicyValue>
</AccessProfile>
</Access>
</Security>
</Org>
Вот код из моего xsl-файла:
<xsl:template match="*[local-name()='Org']/*[local-name()='Security']">
<xsl:variable name="securityDesc" select="document($lookup)/@sam:description" />
<xsl:copy>
<xsl:element name="Access">
<xsl:attribute name="description"><xsl:value-of select="$securityDesc" /></xsl:attribute>
<xsl:for-each select="document($lookup)/AccessProfile">
<xsl:copy>
<xsl:attribute name="description"><xsl:value-of
select="$securityDesc" /></xsl:attribute>
<xsl:for-each select="document($lookup)/AccessProfile/*">
<xsl:variable name="vocabulary" select="document($lookup)/AccessProfileValue/@profileVal" />
<xsl:element name="{name(.)}">
<xsl:attribute name="description"><xsl:value-of select="$securityDesc" /></xsl:attribute>
<xsl:if test="*[name(.)='PolicyValue']">
<xsl:attribute name="vocabulary"><xsl:value-of select="$vocabulary" /></xsl:attribute>
</xsl:if>
<xsl:value-of select="." />
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:for-each>
</xsl:element>
</xsl:copy>
</xsl:template>
Я пытаюсь скопировать узел AccessProfile с элементами в узел безопасности под элементом Access. Когда я копирую его, он удаляет все другие дочерние узлы в разделе «Безопасность», как показано в result.xml для второго элемента безопасности. Мне нужно сохранить данные в целости и сохранности. Также мне нужно добавить атрибут на один из скопированных элементов, чтобы он прошел проверку. Я пытаюсь добавить атрибут к одному из добавленных узловых элементов и не могу это сделать. Также мне нужно добавить дополнительные атрибуты в узел безопасности для проверки. Спасибо за помощь.