XSL转换从xml文件复制数据的问题

时间:2019-03-06 14:29:57

标签: xml xslt

我正在尝试使用xsl转换将数据从file2复制到file1。我能够复制数据,但是对生成的xml文件的xsd验证失败。这是我的代码:

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的元素下的Security节点中。复制它时,它将删除Security下的所有其他子节点,如第二个Security元素的result.xml中所示。我需要保持数据完整。我还需要在复制的元素之一上添加属性,以使其通过验证。我正在尝试向添加的节点元素之一添加属性,但无法做到这一点。另外,我需要将其他属性添加到“安全性”节点以进行验证。感谢您的帮助。

0 个答案:

没有答案