两个变量之间的XSLT min不符合预期

时间:2014-10-28 01:47:51

标签: xml xslt

我试图根据以下内容选择第一个PromotedProgramme:

  • 推广计划类型
  • MovieOrEvent

然后,如果存在多个类型以选择第一个seq_number。

这是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和PromotedProgramme Type的最小seq_number。

EG:在上面的XML示例中,我要查找的结果是仅获取第一个PromotedProgramme。

在结果中应该是:

<?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>

由于 西蒙

1 个答案:

答案 0 :(得分:0)

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

  1. @titleProgrammeId填充的原因更多 一个结果是你误用了// XPath后代或自我步骤。什么时候 你选择//TitleName,你选择所有的 文档中的TitleName个元素。那不是你想要的。 您想要选择特定的PromotedProgramme,然后选择 只有TitleName。 XSLT看起来像这样:

    <xsl:variable name="theProgrammeIWant"
                  select="/PromoMessage/PromotedProgramme[@seq_number = '1']"/>
    

    你可能有一个更复杂的谓词 - 我只是不知道你的问题是什么 - 但你必须知道如何编写上述形式的谓词。

  2. 您的xsl:when test="//TitleName"测试也不太可能。它看起来 就像你可能想要的那样$theProgrammeIWant/TitleName来测试你的节目 想要有一个TitleName。正确获取此模式,然后在代码中为每个匹配项进行复制。

  3. 不要忘记学习基础知识。我建议你阅读一些基本的背景材料,比如Michael Kay的XSLT书。

  4. 我希望这些提示可以帮助您摆脱僵局。