我是一个拥有xsl的newby,并且已经和这个“战斗”了一段时间。经过许多错误的代码和调查,我终于达到了我的目标,但我认为我的代码有很大的改进余地,所以我希望有人能推荐一个代码具有更好的性能。情况就是这样:
我正在收到以下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"/>而不是-每个选择,但然后它从第一个Z1EDP03/E1EDP03的值,而不是一个IDDAT匹配我的要求。
对你们大多数人来说,这可能很简单,我希望有人能帮上忙来改进这个“混乱”的代码。
提前谢谢。
发布于 2016-11-28 22:54:10
你可以缩短你的方法:
<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>或者,为了避免重复代码:
<xsl:template match="/E1EDP01">
<xsl:variable name="pref" select="Z1EDP03[IDDAT='901']" />
<xsl:choose>
<xsl:when test="$pref">
<xsl:value-of select="$pref/DATUM"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="E1EDP03[IDDAT='027']/DATUM"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>发布于 2016-11-28 22:52:54
您可以将-模板应用于满足条件的第一个(按文档顺序排列) Z1EDP03或E1EDP03的E1EDP03.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:apply-templates
select="(Z1EDP03[IDDAT='901']|E1EDP03[IDDAT='027'])[1]/DATUM"/>
</xsl:template>
</xsl:stylesheet>https://stackoverflow.com/questions/40854802
复制相似问题