XSLT分两个变量之间没有表现如预期
问题描述:
我试图根据选择的第一个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 >'0'">
<xsl:value-of select="//TitleName" />
</xsl:when>
<xsl:when test="//EPGTitleName >'0'">
<xsl:value-of select="//EPGTitleName" />
</xsl:when>
<xsl:when test="//SeasonName >'0'">
<xsl:value-of select="//SeasonName" />
</xsl:when>
<xsl:when test="//SlotName >'0'">
<xsl:value-of select="//SlotName" />
</xsl:when>
<xsl:otherwise>
<xsl:if test="//TitleBroadcasterRef > '0'">
<xsl:value-of select="//Intestitial/@name" />
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<Programme>
<ProgrammeId>
<xsl:choose>
<xsl:when test="//ExternalProgId > '0'">
<xsl:value-of select="//ExternalProgId" />
</xsl:when>
<xsl:when test="//TitleId > '0'">
<xsl:value-of select="//TitleId" />
</xsl:when>
<xsl:when test="//SlotId > '0'">
<xsl:value-of select="//SlotId" />
</xsl:when>
<xsl:when test="//PromotedBroadcasterRef > '0'">
<xsl:value-of select="//PromotedBroadcasterRef" />
</xsl:when>
<xsl:otherwise>
<xsl:if test="//TitleBroadcasterRef > '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>
感谢 西蒙
答
有很多问题,你的代码。我不会试图重写,但我会得到你在正确的方向前进:
-
原因
@title
和ProgrammeId
正在填充更多 比一个结果是,你是滥用//
XPath后代或自己的步骤。当您选择 时,例如,您选择//TitleName
,则选择文档中的所有TitleName
元素。这不是你想要的。 你想选择一个特定的PromotedProgramme
,然后选择 只有它的TitleName
。在XSLT会是这个样子:<xsl:variable name="theProgrammeIWant" select="/PromoMessage/PromotedProgramme[@seq_number = '1']"/>
你可能有更复杂的断言 - 我不能告诉它是从你的问题 - 但你必须知道如何写上述形式的谓词。
您的
xsl:when test="//TitleName"
测试也不可能是你想要的。它看起来像 就像你可能意思是$theProgrammeIWant/TitleName
来测试你 想要的程序是否有TitleName
。正确获取此模式,然后在代码中对每个事件进行复制。不要避免学习基础知识。我建议阅读一些基本的背景材料,例如Michael Kay关于XSLT的书。
我希望这些提示可以帮助您摆脱僵局。
请提供一个显示问题的[***最小*,完整和可验证示例(MCVE)**](http://*.com/help/mcve)。谢谢。 – kjhughes 2014-10-28 01:58:03
几乎所有我想知道的是如何调用一个变量来制定一个promoteProgramme类型,并将结果限制为仅找到第一个seq_number:EG:使用MovieOrEvent,仅使用第一个seq_number。目前,我在Title和ProgrammeID Attributes中输出的结果是输出3个结果,谢谢,Simon – Simian7 2014-10-28 07:10:48
请提供一个[*** MINIMAL *,完整和可验证示例(MCVE)**](http://*.com/帮助/麦克风),表现出这个问题。如果你想声明“*两个变量之间的XSLT最小值不符合预期*”,那么你的负担就是显示这是怎么回事,它不应该在* us *中挖掘你的无关代码。谢谢。 – kjhughes 2014-10-28 10:35:33