如果缺少元素B,则复制元素A的值

时间:2017-11-09 04:46:07

标签: xml xslt-2.0

我有这个XML:

<wd:Report_Data xmlns:wd="urn:com.workday.report/INT005_">
<wd:Report_Entry>
    <wd:AREA>Comp1</wd:AREA>
    <wd:TOP>Dept1</wd:TOP>
    <wd:NUMBER>1234567890</wd:NUMBER>
</wd:Report_Entry>
<wd:Report_Entry>
    <wd:AREA>Comp2</wd:AREA>
</wd:Report_Entry>
</wd:Report_Data>

和XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet exclude-result-prefixes="wd" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:wd="urn:com.workday.report/INT005_">

<xsl:output indent="yes" method="xml"/>
<xsl:strip-space elements="*" />

<xsl:template match="wd:Report_Data">
 <wd:Report_Data>
   <xsl:for-each select="wd:Report_Entry">
    <wd:Report_Entry>
      <wd:AREA><xsl:value-of select="wd:AREA"/></wd:AREA>
      <wd:TOP>
         <xsl:choose>
            <xsl:when test="wd:TOP=''">
                <xsl:value-of select="wd:AREA"/>
            </xsl:when>
            <xsl:otherwise><xsl:value-of select="wd:TOP"/></xsl:otherwise>
         </xsl:choose>
      </wd:TOP>
      <wd:NUMBER><xsl:value-of select="wd:NUMBER"/></wd:NUMBER>
    </wd:Report_Entry>
   </xsl:for-each>
  </wd:Report_Data>
</xsl:template> 
</xsl:stylesheet>

条件是: 1.当没有wd:NUMBER时,元素wd:NUMBER应保留在输出文件中(正确设置) 2.当wd:TOP不为空时,只需复制值(正确设置) 3.当wd:TOP不存在时,复制wd的值:AREA(这是问题)

所以期望的输出是:

<?xml version="1.0" encoding="UTF-8"?>
<wd:Report_Data xmlns:wd="urn:com.workday.report/INT005_">
  <wd:Report_Entry>
  <wd:AREA>Comp1</wd:AREA>
  <wd:TOP>Dept1</wd:TOP>
  <wd:NUMBER>1234567890</wd:NUMBER>
 </wd:Report_Entry>
 <wd:Report_Entry>
  <wd:AREA>Comp2</wd:AREA>
  <wd:TOP>Comp2</wd:TOP>
  <wd:NUMBER/>
 </wd:Report_Entry>
</wd:Report_Data>

我应该怎么做条件3?提前谢谢!

1 个答案:

答案 0 :(得分:1)

完全检测节点是否存在:

<xsl:if test="Node">

并且类似地缺少节点的测试是:

<xsl:if test="not(Node)">

我认为你对条件3的要求是

<xsl:if test="not(wd:TOP)">
   <xsl:value-of select="wd:AREA"/>
</xsl:if>

看起来你想要空的或遗失wd:TOP的结果相同,所以:

 <wd:TOP>
     <xsl:choose>
        <xsl:when test="wd:TOP='' or not(wd:TOP)">
            <xsl:value-of select="wd:AREA"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="wd:TOP"/>
        </xsl:otherwise>
     </xsl:choose>
  </wd:TOP>

通常情况下,您可能需要测试的另一个条件是nil,这需要检查:

wd:TOP/@xsi:nil = 'true'