我是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:
在原始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;码。
非常感谢提前。
答案 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>