xsl根据子节点值从节点中选择值

时间:2016-11-28 22:40:40

标签: xml xslt

我是xsl的新手,已经"战斗"有一段时间了。经过许多错误的代码和调查后,我终于达到了我的目标,但我认为我的代码有很大的改进余地,所以我希望有人可以推荐一个性能更好的代码。情况就是这样:

我收到以下XML发票(这是此时读取的发票的一部分):

<E1EDP01>

  <Z1EDP03 SEGMENT="1">
    <IDDAT>901</IDDAT> 
    <DATUM>20160414</DATUM> 
  </Z1EDP03>

  <Z1EDP03 SEGMENT="1">
    <IDDAT>905</IDDAT> 
    <DATUM>20160501</DATUM> 
  </Z1EDP03>

  <E1EDP03 SEGMENT="1">
    <IDDAT>901</IDDAT> 
    <DATUM>20160414</DATUM> 
  </E1EDP03>

  <E1EDP03 SEGMENT="1">
  <IDDAT>027</IDDAT> 
  <DATUM>20160501</DATUM> 
  </E1EDP03>

</E1EDP01>

我的任务是从以下节点中选择DATUM:

  • 来自Z1EDP03,IDDAT = 901(如果存在)
  • 如果第一个不存在,则从E1EDP03获取,其中IDDAT = 027

在原始XML中,我们可能会发现许多具有不同IDDAT值的Z1EDP03 / E1EDP03节点可以忽略。

这是我使用的代码并且它正在运行,但我认为它可以改进(希望你们中的任何一位大师都能启发我):

<xsl:template match="/">
<xsl:choose>
<!-- We first search if Z1EDP03 with IDDAT 901 exists -->
<xsl:when test="./E1EDP01/Z1EDP03[IDDAT='901']">
   <xsl:for-each select="./E1EDP01/Z1EDP03">
          <xsl:if test="./IDDAT='901'"><xsl:value-of select="./DATUM"/></xsl:if>
   </xsl:for-each>
</xsl:when>
<!-- If node Z1EDP03 with IDDAT 901 doesn’t exist then take E1EDP03 where IDDAT is 027 -->
<xsl:otherwise>
   <xsl:for-each select="./E1EDP01/E1EDP03">
      <xsl:if test="(./IDDAT='027')"><xsl:value-of select="./DATUM"/></xsl:if>
   </xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

我尝试过使用

<xsl:value-of select="./DATUM"/>

而不是for-each select,但它从第一个Z1EDP03 / E1EDP03取代了IDDAT符合我要求的值。

对于大多数人来说,这可能很简单,我希望有人可以帮助改善这个&#34;凌乱&#34;码。

非常感谢提前。

2 个答案:

答案 0 :(得分:0)

您可以将模板应用于满足条件的第一个(文档顺序)|No. |Name |Request |Sales Territory |001 |Account 1 |NULL |PNW |002 |Account 2 |MERGE TO 001 |PNW |011 |Account 5 |NULL |EUROPE |500 |Account 8 |MERGE TO 011 |EUROPE DATUM的{​​{1}} ...

Z1EDP03

答案 1 :(得分:0)

您可以缩短您的方法:

\S

或者,为避免重复代码:

<xsl:template match="/E1EDP01">
    <xsl:choose>
        <xsl:when test="Z1EDP03[IDDAT='901']">
            <xsl:value-of select="Z1EDP03[IDDAT='901']/DATUM"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="E1EDP03[IDDAT='027']/DATUM"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>