2014-10-28 40 views
0

我试图根据选择的第一个PromotedProgramme:如果有多个类型存在XSLT分两个变量之间没有表现如预期

  • 促进节目类型
  • 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 Only。

在结果应该是:

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

感谢 西蒙

+5

请提供一个显示问题的[***最小*,完整和可验证示例(MCVE)**](http://stackoverflow.com/help/mcve)。谢谢。 – kjhughes 2014-10-28 01:58:03

+0

几乎所有我想知道的是如何调用一个变量来制定一个promoteProgramme类型,并将结果限制为仅找到第一个seq_number:EG:使用MovieOrEvent,仅使用第一个seq_number。目前,我在Title和ProgrammeID Attributes中输出的结果是输出3个结果,谢谢,Simon – Simian7 2014-10-28 07:10:48

+3

请提供一个[*** MINIMAL *,完整和可验证示例(MCVE)**](http://stackoverflow.com/帮助/麦克风),表现出这个问题。如果你想声明“*两个变量之间的XSLT最小值不符合预期*”,那么你的负担就是显示这是怎么回事,它不应该在* us *中挖掘你的无关代码。谢谢。 – kjhughes 2014-10-28 10:35:33

回答

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的书。

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

+0

感谢您的建议,它实际上做了我需要使用seg_number ='1'。最初它更复杂。删除xpath后代并使用变量。欣赏这本书的提示,绝对是看这个。 – Simian7 2014-11-01 08:30:58

+0

@ Simian7,不客气。如果有帮助,请[**接受**](http://meta.stackoverflow.com/q/5234/234215)这个答案。你也可以考虑接受你的[其他问题]的答案(http://stackoverflow.com/q/26353278/290085)。谢谢。 – kjhughes 2014-11-01 17:51:46

相关问题