Xml 两个变量之间的XSLT最小值不符合预期

Xml 两个变量之间的XSLT最小值不符合预期,xml,xslt,Xml,Xslt,我试图根据以下内容选择第一个促销计划: 推广节目类型 电影事件 然后,如果存在多个类型,则选择第一个序号 这是XML <?xml version="1.0" ?> <PromoMessage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <PromotedProgramme type="MovieOrEven

我试图根据以下内容选择第一个促销计划:

推广节目类型 电影事件 然后,如果存在多个类型,则选择第一个序号

这是XML

<?xml version="1.0" ?> 
<PromoMessage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <PromotedProgramme type="MovieOrEvent" seq_number="1">
    <TitleId>000000218564</TitleId>
    <ExternalProgId>785432</ExternalProgId>
    <TitleBroadcastRef>078654</TitleBroadcastRef>
    <TitleName>Men In Black</TitleName>
  </PromotedProgramme>
  <PromotedProgramme type="MovieOrEvent" seq_number="2">
    <SlotId>675342</SlotId>
    <SlotName>Late Movie</SlotName>
    <TitleId>000000218576</TitleId>
    <ExternalProgId>785632</ExternalProgId>
    <TitleBroadcastRef>078123</TitleBroadcastRef>
    <TitleName>Die Hard</TitleName>
    <EPGTitleName>Die Hard</EPGTitleName>
  </PromotedProgramme>
</PromoMessage>
这是我的XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
  <xsl:template match="/">
    <PromoMessage>
      <!-- Create Variable To Find the First Sequence Numbers -->
      <xsl:variable name="LOW" select="min(//PromotedProgramme/@seq_number)" />
      <xsl:variable name="EMOE" select="boolean(//PromotedProgramme/@type='MovieOrEvent')" />
      <xsl:choose>
        <!--Promoted Programme Type MovieOrEvent-->
        <xsl:when test="$LOW and $EMOE">
          <xsl:attribute name="title">
            <xsl:choose>
              <xsl:when test="//TitleName &gt;'0'">
                <xsl:value-of select="//TitleName" />
              </xsl:when>
              <xsl:when test="//EPGTitleName &gt;'0'">
                <xsl:value-of select="//EPGTitleName" />
              </xsl:when>
              <xsl:when test="//SeasonName &gt;'0'">
                <xsl:value-of select="//SeasonName" />
              </xsl:when>
              <xsl:when test="//SlotName &gt;'0'">
                <xsl:value-of select="//SlotName" />
              </xsl:when>
              <xsl:otherwise>
                <xsl:if test="//TitleBroadcasterRef &gt; '0'">
                  <xsl:value-of select="//Intestitial/@name" />
                </xsl:if>
              </xsl:otherwise>
            </xsl:choose>
          </xsl:attribute>
          <Programme>
            <ProgrammeId>
              <xsl:choose>
                <xsl:when test="//ExternalProgId &gt; '0'">
                  <xsl:value-of select="//ExternalProgId" />
                </xsl:when>
                <xsl:when test="//TitleId &gt; '0'">
                  <xsl:value-of select="//TitleId" />
                </xsl:when>
                <xsl:when test="//SlotId &gt; '0'">
                  <xsl:value-of select="//SlotId" />
                </xsl:when>
                <xsl:when test="//PromotedBroadcasterRef &gt; '0'">
                  <xsl:value-of select="//PromotedBroadcasterRef" />
                </xsl:when>
                <xsl:otherwise>
                  <xsl:if test="//TitleBroadcasterRef &gt; '0'">
                    <xsl:value-of select="//TitleBroadcasterRef" />
                  </xsl:if>
                </xsl:otherwise>
              </xsl:choose>
            </ProgrammeId>
          </Programme>
        </xsl:when>
      </xsl:choose>
    </PromoMessage>
  </xsl:template>
</xsl:stylesheet>
但是,当我运行标题时,ProgrammeID字段会填充多个结果。我试图实现的变量是EMOE和LOW,我想选择第一个PromotedProgrammeType和该PromotedProgrammeType的最小序号

例如:在上面的XML示例中,我要寻找的结果是只选择第一个PromotedProgram

结果应该是:

<?xml version="1.0" encoding="UTF-8"?>
<PromoMessage title="Men In Black" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <Programme>
    <ProgrammeId>785432</ProgrammeId>
  </Programme>
</PromoMessage>
谢谢
Simon

您的代码有很多问题。我不会尝试重写,但我会让你朝着正确的方向前进:

原因@title和ProgrammeId正在填充更多 不止一个结果是您误用了//XPath子代或self步骤。什么时候 您选择,比如说,//TitleName,您选择的是所有 文档中的TitleName元素。那不是你想要的。 要选择特定的促销计划,请选择 只有它的书名。XSLT的外观如下所示:

<xsl:variable name="theProgrammeIWant"
              select="/PromoMessage/PromotedProgramme[@seq_number = '1']"/>
你可能会有一个更复杂的谓词——我只是无法从你的问题中分辨出它是什么- 但是您必须知道如何编写上述形式的谓词

您的xsl:when test=//标题名测试也不可能是您想要的。看起来 就像您可能指的是$theProgrammeIWant/TitleName,用于测试程序是否 want有一个标题名。正确使用此模式,然后在代码中复制每次出现的情况

不要逃避学习基础知识。我建议您阅读一些基本的背景资料,如Michael Kay关于XSLT的书


我希望这些提示能帮助您走出困境。

请提供一个能说明问题的例子。谢谢。我只想知道如何调用一个变量来计算promotedProgram类型,并将结果限制为找到的第一个序号:例如:使用MovieOrEvent,只使用第一个序号。目前,我在标题和ProgrammeID属性中对此的输出正在输出3个结果,谢谢,Simon请提供一个显示问题的示例。如果您想声称两个变量之间的XSLT min没有按照预期的方式运行,那么您就有责任展示它是如何运行的,而不应该让我们去挖掘无关的代码。谢谢,谢谢@kjhughes,明白了。我减少了原始代码,只关注这个问题。在title和ProgrammeId中,当我想将XML限制为一个结果时,它们会从XML输出多个结果。我试图使用的是两个变量EMOE和LOW来计算出第一个PromotedProgrammeType和找到的第一个序号。注意:我只把MovieOrEvent作为一个推广的节目类型包括在这里,但还有更多可能出现。我希望这能更好地解释我面临的问题,谢谢,西蒙尼仍然不明白你的问题。你能用简单的语言阐述一下这里的任务是什么吗?你做了什么和没有做什么对理解需要做什么没有帮助。谢谢你的建议,它实际上做了我需要的事情,使用seg_数='1'。原来比较复杂。删除xpath子体并使用变量。感谢书中的提示,一定要查一下。@Simian7,不客气。如果有帮助,请回答这个问题。你也可以考虑接受你的答案。谢谢