'Loop' 通过多个 XML 元素(同名)使用 XSL 1.0 检索最大集合节点值
'Loop' through multiple XML elements (of the same name) to retrieve the largest collective node value using XSL 1.0
我正在制作一个简单的 HTML 网页,使用书店示例,并通过 XML 的组合输出我的网页内容数据和 XSLT(1.0),但我最近遇到了一个问题,我想从 Whosebug 社区收到一些反馈和建议。
背景:
在我的书店示例中,我有一系列名为 <book></book>
的主要元素,其中包含有关出版物的重要详细信息,例如 <title></title>
和 <author></author>
。
现在,在每个 <book></book>
元素中,我还有一个名为 <promotions></promotions>
的重要元素,它包含单个 ID 号 (<promotionNum></promotionNum>
),用作 link 到更详细地处理促销的进一步元素中的相应节点。
XML结构:
<bookstore>
<book>
<title>Harry Potter and the Philosopher's Stone</title>
<author>J K. Rowling</author>
<year>1997</year>
<price>3.99</price>
<publisher>Bloomsbury (UK)</publisher>
<synopsis>
Harry Potter and the Philosopher's Stone is the first novel in the Harry Potter series and J. K. Rowling's debut novel.
The plot follows Harry Potter, a young wizard who discovers his magical heritage as he makes close friends and a few enemies in his first year at the Hogwarts School of Witchcraft and Wizardry.
With the help of his friends, Harry faces an attempted comeback by the dark wizard Lord Voldemort, who killed Harry's parents, but failed to kill Harry when he was just a year old.
</synopsis>
<promotions>
<promotionNum>1</promotionNum>
<promotionNum>2</promotionNum>
<promotionNum>3</promotionNum>
<promotionNum>4</promotionNum>
</promotions>
</book>
<book>
<title>The Girl with the Dragon Tattoo</title>
<author>Stieg Larsson</author>
<year>2005</year>
<price>5.99</price>
<publisher>Norstedts Förlag (SWE)</publisher>
<synopsis>
In Stockholm, Sweden, journalist Mikael Blomkvist, co-owner of Millennium magazine, has lost a libel case brought against him by businessman Hans-Erik Wennerström. Lisbeth Salander, a brilliant but troubled investigator and hacker, compiles an extensive background check on Blomkvist for business magnate Henrik Vanger, who has a special task for him.
In exchange for the promise of damning information about Wennerström, Blomkvist agrees to investigate the disappearance and assumed murder of Henrik's grandniece, Harriet, 40 years ago.
After moving to the Vanger family's compound, Blomkvist uncovers a notebook containing a list of names and numbers that no one has been able to decipher.
</synopsis>
<promotions>
<promotionNum>5</promotionNum>
<promotionNum>6</promotionNum>
<promotionNum>3</promotionNum>
<promotionNum>2</promotionNum>
</promotions>
</book>
<promotion>
<promotionID>1</promotionID>
<percentageOff>10</percentageOff>
<promotionalMerchandise>No</promotionalMerchandise>
<promotionStartDate>2015-10-14T00:00:00</promotionStartDate>
<promotionEndDate>2015-10-19T00:00:00</promotionEndDate>
</promotion>
<promotion>
<promotionID>2</promotionID>
<percentageOff>15</percentageOff>
<promotionalMerchandise>No</promotionalMerchandise>
<promotionStartDate>2015-10-11T00:00:00</promotionStartDate>
<promotionEndDate>2015-10-16T00:00:00</promotionEndDate>
</promotion>
<promotion>
<promotionID>3</promotionID>
<percentageOff>30</percentageOff>
<promotionalMerchandise>Yes</promotionalMerchandise>
<promotionStartDate>2015-09-02T00:00:00</promotionStartDate>
<promotionEndDate>2015-09-07T00:00:00</promotionEndDate>
</promotion>
<promotion>
<promotionID>4</promotionID>
<percentageOff>5</percentageOff>
<promotionalMerchandise>Yes</promotionalMerchandise>
<promotionStartDate>2015-11-22T00:00:00</promotionStartDate>
<promotionEndDate>2015-11-27T00:00:00</promotionEndDate>
</promotion>
<promotion>
<promotionID>5</promotionID>
<percentageOff>50</percentageOff>
<promotionalMerchandise>No</promotionalMerchandise>
<promotionStartDate>2015-08-13T00:00:00</promotionStartDate>
<promotionEndDate>2015-08-18T00:00:00</promotionEndDate>
</promotion>
<promotion>
<promotionID>6</promotionID>
<percentageOff>80</percentageOff>
<promotionalMerchandise>No</promotionalMerchandise>
<promotionStartDate>2015-07-01T00:00:00</promotionStartDate>
<promotionEndDate>2015-07-05T00:00:00</promotionEndDate>
</promotion>
</bookstore>
我想实现什么目标?
对于每个 <book></book>
元素,我想循环遍历关联的 <promotions></promotions>
,使用 <xsl:for-each>
语句或 <template></template>
捕获 <promotionNum>
变量中的数字 ID,例如$IDNum
.
然后使用我的 ID 变量作为验证,我想将这个数字与六个 <promotion>
元素交叉引用。如果我们成功匹配,例如<xsl:for-each select="dataroot/Promotion"><xsl:if test="$IDNum">
,然后我想在另一个变量中捕获 <promotionEndDate>
节点的值。
但这是重要的部分,我想找到最新的日期(或最大值)。因此,对于 <title>Harry Potter and the Philosopher's Stone</title>
,在四个关联的促销元素 (1-4) 中,我希望从 <promotion><promotionID>4</promotionID></promotion>
.
检索 <promotionEndDate>2015-11-27T00:00:00</promotionEndDate>
(最新日期)
我知道与 XSLT 2.0 不同,XSLT 1.0 和日期不兼容,因此在创建变量来存储 <promotionEndDate></promotionEndDate>
时,需要有一个 substring 在 'T' 之后进行处理,然后进行 translate 处理以丢失连字符,从而为您提供有效的图形,例如2015-11-27T00:00:00
变为 20151127
(即数字)。
为什么?我想知道任何选定出版物的促销活动 运行 的最终日期。
这可以使用 XSLT 1.0 实现吗?对于每个 <promotionEndDate></promotionEndDate>
节点,我可以 运行 substring/translate 处理,然后有一个模板将这个日期数字捕获在一个变量中,然后将它与通过模板传递的下一个可用日期值进行比较.如果这个新数字比之前的数字gt;
,那么这个就成为新的最高数字?
一如既往,任何建议都会受到热烈欢迎!!
对交叉引用使用关键字,然后在该日期对它们进行排序以查找最新的(最大编号):
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:key name="prom-by-id" match="bookstore/promotion" use="promotionID"/>
<xsl:template match="bookstore">
<xsl:apply-templates select="book"/>
</xsl:template>
<xsl:template match="book">
<xsl:copy>
<xsl:copy-of select="title"/>
<xsl:for-each select="key('prom-by-id', promotions/promotionNum)">
<xsl:sort select="translate(promotionEndDate, '-T:', '')" data-type="number" order="descending"/>
<xsl:if test="position() = 1">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
您曾说过要将 HTML 作为输出,但由于您没有显示为 book
元素创建 HTML 的任何 XSLT 代码,我选择简单地输出book
本身及其交叉引用promotion
,当然你可以将模板更改为输出HTML,查找促销的方法保持不变。
我正在制作一个简单的 HTML 网页,使用书店示例,并通过 XML 的组合输出我的网页内容数据和 XSLT(1.0),但我最近遇到了一个问题,我想从 Whosebug 社区收到一些反馈和建议。
背景:
在我的书店示例中,我有一系列名为 <book></book>
的主要元素,其中包含有关出版物的重要详细信息,例如 <title></title>
和 <author></author>
。
现在,在每个 <book></book>
元素中,我还有一个名为 <promotions></promotions>
的重要元素,它包含单个 ID 号 (<promotionNum></promotionNum>
),用作 link 到更详细地处理促销的进一步元素中的相应节点。
XML结构:
<bookstore>
<book>
<title>Harry Potter and the Philosopher's Stone</title>
<author>J K. Rowling</author>
<year>1997</year>
<price>3.99</price>
<publisher>Bloomsbury (UK)</publisher>
<synopsis>
Harry Potter and the Philosopher's Stone is the first novel in the Harry Potter series and J. K. Rowling's debut novel.
The plot follows Harry Potter, a young wizard who discovers his magical heritage as he makes close friends and a few enemies in his first year at the Hogwarts School of Witchcraft and Wizardry.
With the help of his friends, Harry faces an attempted comeback by the dark wizard Lord Voldemort, who killed Harry's parents, but failed to kill Harry when he was just a year old.
</synopsis>
<promotions>
<promotionNum>1</promotionNum>
<promotionNum>2</promotionNum>
<promotionNum>3</promotionNum>
<promotionNum>4</promotionNum>
</promotions>
</book>
<book>
<title>The Girl with the Dragon Tattoo</title>
<author>Stieg Larsson</author>
<year>2005</year>
<price>5.99</price>
<publisher>Norstedts Förlag (SWE)</publisher>
<synopsis>
In Stockholm, Sweden, journalist Mikael Blomkvist, co-owner of Millennium magazine, has lost a libel case brought against him by businessman Hans-Erik Wennerström. Lisbeth Salander, a brilliant but troubled investigator and hacker, compiles an extensive background check on Blomkvist for business magnate Henrik Vanger, who has a special task for him.
In exchange for the promise of damning information about Wennerström, Blomkvist agrees to investigate the disappearance and assumed murder of Henrik's grandniece, Harriet, 40 years ago.
After moving to the Vanger family's compound, Blomkvist uncovers a notebook containing a list of names and numbers that no one has been able to decipher.
</synopsis>
<promotions>
<promotionNum>5</promotionNum>
<promotionNum>6</promotionNum>
<promotionNum>3</promotionNum>
<promotionNum>2</promotionNum>
</promotions>
</book>
<promotion>
<promotionID>1</promotionID>
<percentageOff>10</percentageOff>
<promotionalMerchandise>No</promotionalMerchandise>
<promotionStartDate>2015-10-14T00:00:00</promotionStartDate>
<promotionEndDate>2015-10-19T00:00:00</promotionEndDate>
</promotion>
<promotion>
<promotionID>2</promotionID>
<percentageOff>15</percentageOff>
<promotionalMerchandise>No</promotionalMerchandise>
<promotionStartDate>2015-10-11T00:00:00</promotionStartDate>
<promotionEndDate>2015-10-16T00:00:00</promotionEndDate>
</promotion>
<promotion>
<promotionID>3</promotionID>
<percentageOff>30</percentageOff>
<promotionalMerchandise>Yes</promotionalMerchandise>
<promotionStartDate>2015-09-02T00:00:00</promotionStartDate>
<promotionEndDate>2015-09-07T00:00:00</promotionEndDate>
</promotion>
<promotion>
<promotionID>4</promotionID>
<percentageOff>5</percentageOff>
<promotionalMerchandise>Yes</promotionalMerchandise>
<promotionStartDate>2015-11-22T00:00:00</promotionStartDate>
<promotionEndDate>2015-11-27T00:00:00</promotionEndDate>
</promotion>
<promotion>
<promotionID>5</promotionID>
<percentageOff>50</percentageOff>
<promotionalMerchandise>No</promotionalMerchandise>
<promotionStartDate>2015-08-13T00:00:00</promotionStartDate>
<promotionEndDate>2015-08-18T00:00:00</promotionEndDate>
</promotion>
<promotion>
<promotionID>6</promotionID>
<percentageOff>80</percentageOff>
<promotionalMerchandise>No</promotionalMerchandise>
<promotionStartDate>2015-07-01T00:00:00</promotionStartDate>
<promotionEndDate>2015-07-05T00:00:00</promotionEndDate>
</promotion>
</bookstore>
我想实现什么目标?
对于每个 <book></book>
元素,我想循环遍历关联的 <promotions></promotions>
,使用 <xsl:for-each>
语句或 <template></template>
捕获 <promotionNum>
变量中的数字 ID,例如$IDNum
.
然后使用我的 ID 变量作为验证,我想将这个数字与六个 <promotion>
元素交叉引用。如果我们成功匹配,例如<xsl:for-each select="dataroot/Promotion"><xsl:if test="$IDNum">
,然后我想在另一个变量中捕获 <promotionEndDate>
节点的值。
但这是重要的部分,我想找到最新的日期(或最大值)。因此,对于 <title>Harry Potter and the Philosopher's Stone</title>
,在四个关联的促销元素 (1-4) 中,我希望从 <promotion><promotionID>4</promotionID></promotion>
.
<promotionEndDate>2015-11-27T00:00:00</promotionEndDate>
(最新日期)
我知道与 XSLT 2.0 不同,XSLT 1.0 和日期不兼容,因此在创建变量来存储 <promotionEndDate></promotionEndDate>
时,需要有一个 substring 在 'T' 之后进行处理,然后进行 translate 处理以丢失连字符,从而为您提供有效的图形,例如2015-11-27T00:00:00
变为 20151127
(即数字)。
为什么?我想知道任何选定出版物的促销活动 运行 的最终日期。
这可以使用 XSLT 1.0 实现吗?对于每个 <promotionEndDate></promotionEndDate>
节点,我可以 运行 substring/translate 处理,然后有一个模板将这个日期数字捕获在一个变量中,然后将它与通过模板传递的下一个可用日期值进行比较.如果这个新数字比之前的数字gt;
,那么这个就成为新的最高数字?
一如既往,任何建议都会受到热烈欢迎!!
对交叉引用使用关键字,然后在该日期对它们进行排序以查找最新的(最大编号):
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:key name="prom-by-id" match="bookstore/promotion" use="promotionID"/>
<xsl:template match="bookstore">
<xsl:apply-templates select="book"/>
</xsl:template>
<xsl:template match="book">
<xsl:copy>
<xsl:copy-of select="title"/>
<xsl:for-each select="key('prom-by-id', promotions/promotionNum)">
<xsl:sort select="translate(promotionEndDate, '-T:', '')" data-type="number" order="descending"/>
<xsl:if test="position() = 1">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
您曾说过要将 HTML 作为输出,但由于您没有显示为 book
元素创建 HTML 的任何 XSLT 代码,我选择简单地输出book
本身及其交叉引用promotion
,当然你可以将模板更改为输出HTML,查找促销的方法保持不变。