Проблема с XSL-преобразованием при копировании данных из xml-файла - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь скопировать данные из файла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 для второго элемента безопасности. Мне нужно сохранить данные в целости и сохранности. Также мне нужно добавить атрибут на один из скопированных элементов, чтобы он прошел проверку. Я пытаюсь добавить атрибут к одному из добавленных узловых элементов и не могу это сделать. Также мне нужно добавить дополнительные атрибуты в узел безопасности для проверки. Спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...