使用 XSLT 转换在 XML 上添加缺失的元素

Adding missing element on XML using XSLT transformation

我对编写 XSLT 转换逻辑还很陌生,所以有人可以帮我解决这个问题。

我正在使用 XSLT 进行 XML 到 XML 的转换,我的想法是插入缺失的元素。

输入XML:

<EmpJob>    
    <EmpJob>
      <emplStatus>3805</emplStatus>
      <lastName>Jhonny</lastName>
     <firstName>English</firstName>                
     <EmpJobRelationships>      
      <relUserNav>
        <User>
          <defaultName>Crystal</defaultName>
          <userId>00174941</userId>
        </User>
      </relUserNav>      
    </EmpJobRelationships> 
    </EmpJob>
    <EmpJob>
    <emplStatus>3805</emplStatus>      
    <lastName>Tony</lastName>
    <firstName>Romo</firstName>                
    </EmpJob>   
<EmpJob>

需要 XML 使用 XSLT 转换的输出

<EmpJob>    
    <EmpJob>
      <emplStatus>3805</emplStatus>
      <lastName>Johnny</lastName>
     <firstName>English</firstName>                
     <EmpJobRelationships>      
      <relUserNav>
        <User>
          <defaultName>Crystal</defaultName>
          <userId>00174941</userId>
        </User>
      </relUserNav>      
    </EmpJobRelationships> 
    </EmpJob>
    <EmpJob>
    <emplStatus>3805</emplStatus>      
    <lastName>Tony</lastName>
    <firstName>Romo</firstName> 
     <EmpJobRelationships>      
      <relUserNav>
        <User>
          <defaultName></defaultName>
          <userId></userId>
        </User>
      </relUserNav>      
    </EmpJobRelationships>  
    </EmpJob>   
<EmpJob>

我厌倦了下面的 XSLT,但是缺少的元素曾经添加到第一个 Parent 的末尾,但它希望它发生在每个 child 上。我如何将逻辑放入循环中,以便它发生在每个 child

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
   <xsl:strip-space elements="*"/>
    
<xsl:output method="xml" indent="yes"/>

<xsl:template match="@*|node()">
   <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
   </xsl:copy>
</xsl:template>

<xsl:template match="/*[not(//EmpJobRelationships)]">
   <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
     <EmpJobRelationships>
      <relationshipType></relationshipType>
      <relUserNav>
        <User>
          <defaultFullName></defaultFullName>
          <userId></userId>
        </User>
      </relUserNav>
      <userId></userId>
      <startDate></startDate>
    </EmpJobRelationships>
   </xsl:copy>
</xsl:template> 

</xsl:stylesheet>

谢谢

假设“缺失元素”是 EmpJobRelationships 并且它存在或完全缺失,请尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="/EmpJob/EmpJob[not(EmpJobRelationships)]">
    <xsl:copy>
        <xsl:apply-templates/>
        <EmpJobRelationships>      
            <relUserNav>
                <User>
                    <defaultName/>
                    <userId/>
                </User>
            </relUserNav>      
        </EmpJobRelationships>  
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

注意匹配模式 /EmpJob/EmpJob 旨在防止将模板应用于同名的根元素。