Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html XSL:XSL:if测试不起作用并计算总和_Html_Xslt_Xslt 1.0 - Fatal编程技术网

Html XSL:XSL:if测试不起作用并计算总和

Html XSL:XSL:if测试不起作用并计算总和,html,xslt,xslt-1.0,Html,Xslt,Xslt 1.0,对于下面的简化转换表,我想添加以下函数: 对于“2019年营业额”和“2020年营业额”,我希望红色徽章中的值低于1mio,绿色徽章中的值高于1mio。我尝试为“2019年营业额”实现此功能,但我只得到一个空白输出。问题似乎出在-部分,因为如果我只输入(请参阅“营业额2020”),我会得到正确的值 对于“总营业额”,我需要总结“2019年营业额”和“2020年营业额”的值。我该怎么做 XSL: <xsl:stylesheet version="1.0" xmlns:xs

对于下面的简化转换表,我想添加以下函数:

  • 对于“2019年营业额”和“2020年营业额”,我希望红色徽章中的值低于1mio,绿色徽章中的值高于1mio。我尝试为“2019年营业额”实现此功能,但我只得到一个空白输出。问题似乎出在
    -部分,因为如果我只输入
    (请参阅“营业额2020”),我会得到正确的值
  • 对于“总营业额”,我需要总结“2019年营业额”和“2020年营业额”的值。我该怎么做
  • XSL

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:key name="keyToPerson" match="person" use="id"/>
      <xsl:key name="keyToCreditcard" match="creditcard" use="cardowner"/>
    
      <xsl:template match="/">
        <xsl:for-each select="data/persons/person">
          <xsl:if test="turnoverYear1 &lt; 1000000">
            <span class="badge bg-warning mx-2"><xsl:value-of select="key('keyToCreditcard', id)/turnoverYear1"/></span>
          </xsl:if>
          <xsl:if test="turnoverYear1 &gt; 999999.99">
            <span class="badge bg-danger mx-2"><xsl:value-of select="key('keyToCreditcard', id)/turnoverYear1"/></span>
          </xsl:if>
          <xsl:value-of select="key('keyToCreditcard', id)/turnoverYear2"/>
        </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>
    
    <data>
     <persons>
       <person>
          <id>1</id>
          <name>Jeramie Bischoff</name>
          <city>Luzern</city>
          <birthdate>04/16/1951</birthdate>
        </person>
      </persons>
      <creditcards>
        <creditcard>
          <id>1</id>
          <cardtype>Visa</cardtype>
          <cardnumber>4041592612048990</cardnumber>
          <turnoverYear1>952411.33</turnoverYear1>
          <turnoverYear2>6135840.0</turnoverYear2>
          <cardowner>1</cardowner>
      </creditcard>
     </creditcards>
    </data>
    

    基于您的示例XML,一个好方法是将内容拆分为多个模板

    一个用来创建基本的HTML文档结构(
    match=“/”
    ),一个用来处理
    元素,一个用来处理营业额徽章,等等。一般来说,更喜欢
    而不是用一堆嵌套的
    将所有内容塞进一个模板是有益的

    由于您有一个将个人ID链接到信用卡的
    ,因此使用它将
    提取到变量(
    $cc
    )中并使用它

    <xsl:output method="html" indent="yes" />
    <xsl:key name="keyToCreditcard" match="creditcard" use="cardowner"/>
    
    <xsl:template match="/">
      <html>
        <!-- ... -->
        <xsl:apply-templates select="data/persons/person" />
        <!-- ... -->
      </html>
    </xsl:template>
    
    <xsl:template match="person">
      <div class="person">
        <xsl:variable name="cc" select="key('keyToCreditcard', id)" />
        <!-- your question #1 -->
        <div>
          <xsl:text>Turnover 2019: </xsl:text>
          <xsl:apply-templates select="$cc/turnoverYear1" />
        </div>
        <div>
          <xsl:text>Turnover 2020: </xsl:text>
          <xsl:apply-templates select="$cc/turnoverYear2" />
        </div>
        <!-- your question #2 -->
        <div>
          <xsl:text>Total Turnover: </xsl:text>
          <xsl:value-of select="$cc/turnoverYear1 + $cc/turnoverYear2" />
        </div>
      </div>
    </xsl:template>
    
    <xsl:template match="turnoverYear1|turnoverYear2">
      <span>
        <xsl:attribute name="class">
          <xsl:text>badge mx-2 </xsl:text>
          <xsl:choose>
            <xsl:when test=". &lt; 1000000">bg-warning</xsl:when>
            <xsl:when test=". &lt; 99999.99">bg-danger</xsl:when>
          </xsl:choose>
        </xsl:attribute>
        <xsl:value-of select="." />
      </span>
    </xsl:template>
    
    
    2019年营业额:
    2020年营业额:
    总营业额:
    徽章mx-2
    背景警告
    bg危险
    
    导致

    <html>
      <div class="person">
        <div>Turnover 2019: <span class="badge mx-2 bg-warning">952411.33</span></div>
        <div>Turnover 2020: <span class="badge mx-2">6135840.0</span></div>
        <div>Total Turnover: 7088251.33</div>
      </div>
    </html>
    
    
    2019年营业额:952411.33
    2020年营业额:6135840.0
    总营业额:7088251.33
    

    因为年号和XML元素名称在XML中是一个移动的目标,所以您必须每年不断调整XSLT代码。那完全没有必要。不使用XML元素名称更明智。将其移动到属性中:

    <creditcards>
      <creditcard>
        <id>1</id>
        <cardtype>Visa</cardtype>
        <cardnumber>4041592612048990</cardnumber>
        <turnover year="2019">952411.33</turnover>
        <turnover year="2020">6135840.0</turnover>
        <cardowner>1</cardowner>
      </creditcard>
    </creditcards>
    
    
    1.
    签证
    4041592612048990
    952411.33
    6135840
    1.
    
    通过这样的
    设置,XSLT代码变得更加通用

    <xsl:template match="person">
      <div class="person">
        <xsl:variable name="cc" select="key('keyToCreditcard', id)" />
        <!-- your question #1 -->
        <xsl:apply-templates select="$cc/turnover" />
        <!-- your question #2 -->
        <div>
          <xsl:text>Total Turnover: </xsl:text>
          <xsl:value-of select="sum($cc/turnover)" />
        </div>
      </div>
    </xsl:template>
    
    <xsl:template match="turnover">
      <div>
        <xsl:value-of select="concat('Turnover ', @year, ': ')" />
        <span>
          <xsl:attribute name="class">
            <xsl:text>badge mx-2 </xsl:text>
            <xsl:choose>
              <xsl:when test=". &lt; 1000000">bg-warning</xsl:when>
              <xsl:when test=". &lt; 99999.99">bg-danger</xsl:when>
            </xsl:choose>
          </xsl:attribute>
          <xsl:value-of select="." />
        </span>
      </div>
    </xsl:template>
    
    
    总营业额:
    徽章mx-2
    背景警告
    bg危险
    
    如果没有看到您正在使用的XML,就无法回答此问题。请发布一个包含输入和预期输出(作为代码)的文档。此外,您显然有名为
    的元素。那是个坏主意。如果你能做些什么,改变它。让元素以其名称携带数据会让生活变得更加困难。改用类似于
    的东西。1mio是否意味着100000?谢谢大家的投入,我现在已经相应地修改了这个。非常感谢你们的帮助,这很有效@安佳:很高兴听到。但也要想想你得到的所有评论。例如,计划一下当每个人都有一张以上的信用卡时会发生什么。
    <xsl:template match="person">
      <div class="person">
        <xsl:variable name="cc" select="key('keyToCreditcard', id)" />
        <!-- your question #1 -->
        <xsl:apply-templates select="$cc/turnover" />
        <!-- your question #2 -->
        <div>
          <xsl:text>Total Turnover: </xsl:text>
          <xsl:value-of select="sum($cc/turnover)" />
        </div>
      </div>
    </xsl:template>
    
    <xsl:template match="turnover">
      <div>
        <xsl:value-of select="concat('Turnover ', @year, ': ')" />
        <span>
          <xsl:attribute name="class">
            <xsl:text>badge mx-2 </xsl:text>
            <xsl:choose>
              <xsl:when test=". &lt; 1000000">bg-warning</xsl:when>
              <xsl:when test=". &lt; 99999.99">bg-danger</xsl:when>
            </xsl:choose>
          </xsl:attribute>
          <xsl:value-of select="." />
        </span>
      </div>
    </xsl:template>