首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于子节点值从节点选择值

基于子节点值从节点选择值
EN

Stack Overflow用户
提问于 2016-11-28 22:40:40
回答 2查看 340关注 0票数 1

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

我正在收到以下XML发票(这是目前正在阅读的发票的一部分):

代码语言:javascript
复制
<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 where IDDAT=027

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

这是我使用过的代码,它正在工作,但我认为它可以改进(希望你们中的任何一位专家都能启发我):

代码语言:javascript
复制
<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>

我试过用

代码语言:javascript
复制
<xsl:value-of select="./DATUM"/>

而不是-每个选择,但然后它从第一个Z1EDP03/E1EDP03的值,而不是一个IDDAT匹配我的要求。

对你们大多数人来说,这可能很简单,我希望有人能帮上忙来改进这个“混乱”的代码。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-28 22:54:10

你可以缩短你的方法:

代码语言:javascript
复制
<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>

或者,为了避免重复代码:

代码语言:javascript
复制
<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>
票数 0
EN

Stack Overflow用户

发布于 2016-11-28 22:52:54

您可以将-模板应用于满足条件的第一个(按文档顺序排列) Z1EDP03E1EDP03E1EDP03.

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40854802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档