如何计算 xslt 1.0 中日期范围内的元素?
How to count elements what in date range in xslt 1.0?
我有点卡住了,也许有人可以帮帮我。
所以我有一个 xml,我想计算那些在日期范围内的歌曲。
我试过翻译日期或对其进行子字符串化,但它仍然没有计算在内。
我的XML:
<?xml version="1.0" encoding="UTF-8"?>
<albums>
<ALBUM>
<closingDate>
<DATE date="2021-10-09"/>
</closingDate>
<songsinalbum>
<SONGSINALBUM>
<song>
<SONG>
<songStatus>
<ESP_SONGSTATUS name="Prehistoric"/>
</songStatus>
<SONGType>
<ESP_SONGTYPE type="metal"/>
</SONGType>
<Date>
<ESP_DATE date="2021-10-09"/>
</Date>
</SONG>
<SONG>
<songStatus>
<ESP_SONGSTATUS name="Prehistoric"/>
</songStatus>
<SONGType>
<ESP_SONGTYPE type="metal"/>
</SONGType>
<Date>
<ESP_DATE date="2022-01-09"/>
</Date>
</SONG>
<SONG>
<songStatus>
<ESP_SONGSTATUS name="Expired"/>
</songStatus>
<SONGType>
<ESP_SONGTYPE type="metal"/>
</SONGType>
<Date/>
</SONG>
<SONG>
<songStatus>
<ESP_SONGSTATUS name="Available"/>
</songStatus>
<SONGType>
<ESP_SONGTYPE type="metal"/>
</SONGType>
<Date>
<ESP_DATE date="2022-03-20"/>
</Date>
</SONG>
</song>
</SONGSINALBUM>
</songsinalbum>
</ALBUM>
</albums>
我的 XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<Workbook>
<Styles>
<Style ss:ID="mydefault" ss:Name="mydefault">
<Font ss:FontName="Verdana" ss:Bold="0"/>
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
</Style>
</Styles>
<Worksheet ss:Name="Report">
<xsl:call-template name="ws_table"/>
</Worksheet>
</Workbook>
</xsl:template>
<xsl:template name="ws_table">
<Table>
<xsl:call-template name="headerrow"/>
<xsl:apply-templates select="albums/ALBUM" mode="datarow"/>
</Table>
</xsl:template>
<xsl:template name="headerrow">
<Row>
<!-- Date -->
<Cell>
<Data ss:Type="String">Date</Data>
</Cell>
<!-- test counting -->
<Cell>
<Data ss:Type="String">test counting</Data>
</Cell>
<!-- real count -->
<Cell>
<Data ss:Type="String">real count</Data>
</Cell>
</Row>
</xsl:template>
<xsl:template match="ALBUM" mode="datarow">
<xsl:variable name="InRange" select="translate(songsinalbum/SONGSINALBUM/song/SONG[songStatus/ESP_SONGSTATUS/@name='Prehistoric'][SONGType/ESP_SONGTYPE/@type='metal']/Date/ESP_DATE/@date,'-','') <= translate(closingDate/DATE/@date,'-','')"/>
<xsl:variable name="formateddate" select="number(concat
(substring(closingDate/DATE/@date, 1, 4),
substring(closingDate/DATE/@date, 6, 2),
substring(closingDate/DATE/@date, 9, 2)))
<=
number(concat
(substring(songsinalbum/SONGSINALBUM/song/SONG[songStatus/ESP_SONGSTATUS/@name='Prehistoric'][SONGType/ESP_SONGTYPE/@type='metal']/Date/ESP_DATE/@date, 1, 4),
substring(songsinalbum/SONGSINALBUM/song/SONG[songStatus/ESP_SONGSTATUS/@name='Prehistoric'][SONGType/ESP_SONGTYPE/@type='metal']/Date/ESP_DATE/@date, 6, 2),
substring(songsinalbum/SONGSINALBUM/song/SONG[songStatus/ESP_SONGSTATUS/@name='Prehistoric'][SONGType/ESP_SONGTYPE/@type='metal']/Date/ESP_DATE/@date, 9, 2)))" />
<Row>
<!-- Date -->
<Cell>
<Data ss:Type="String">
<xsl:value-of select="closingDate/DATE/@date"/>
</Data>
</Cell>
<!-- test counting -->
<Cell>
<Data ss:Type="String">
<xsl:value-of select="count(songsinalbum/SONGSINALBUM/song/SONG[songStatus/ESP_SONGSTATUS/@name='Prehistoric'][SONGType/ESP_SONGTYPE/@type='metal'])"/>
</Data>
</Cell>
<!-- songs what is -->
<Cell>
<Data ss:Type="String">
<xsl:value-of select="count($formateddate)"/>
</Data>
</Cell>
</Row>
</xsl:template>
</xsl:stylesheet>
输出应该是这样的:
enter image description here
还有。截止日期可以更改,所以如果它像“2022-01-09”,那么“实际计数”值应该是“2”。
所以我做错了什么?
谢谢,
此致
考虑以下最小化示例:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/albums">
<results>
<xsl:for-each select="ALBUM">
<xsl:variable name="close-date" select="translate(closingDate/DATE/@date, '-', '')" />
<xsl:variable name="songs" select="songsinalbum/SONGSINALBUM/song/SONG" />
<xsl:variable name="songs-before" select="$songs[translate(Date/ESP_DATE/@date, '-', '') <= $close-date]" />
<songs>
<xsl:value-of select="count($songs)" />
</songs>
<songs-before>
<xsl:value-of select="count($songs-before)" />
</songs-before>
</xsl:for-each>
</results>
</xsl:template>
</xsl:stylesheet>
应用于您的 XML 示例输入时,结果将是:
<?xml version="1.0" encoding="UTF-8"?>
<results>
<songs>4</songs>
<songs-before>1</songs-before>
</results>
如果您将截止日期更改为 2022-01-09
,则结果将为:
<?xml version="1.0" encoding="UTF-8"?>
<results>
<songs>4</songs>
<songs-before>2</songs-before>
</results>
我有点卡住了,也许有人可以帮帮我。
所以我有一个 xml,我想计算那些在日期范围内的歌曲。 我试过翻译日期或对其进行子字符串化,但它仍然没有计算在内。
我的XML:
<?xml version="1.0" encoding="UTF-8"?>
<albums>
<ALBUM>
<closingDate>
<DATE date="2021-10-09"/>
</closingDate>
<songsinalbum>
<SONGSINALBUM>
<song>
<SONG>
<songStatus>
<ESP_SONGSTATUS name="Prehistoric"/>
</songStatus>
<SONGType>
<ESP_SONGTYPE type="metal"/>
</SONGType>
<Date>
<ESP_DATE date="2021-10-09"/>
</Date>
</SONG>
<SONG>
<songStatus>
<ESP_SONGSTATUS name="Prehistoric"/>
</songStatus>
<SONGType>
<ESP_SONGTYPE type="metal"/>
</SONGType>
<Date>
<ESP_DATE date="2022-01-09"/>
</Date>
</SONG>
<SONG>
<songStatus>
<ESP_SONGSTATUS name="Expired"/>
</songStatus>
<SONGType>
<ESP_SONGTYPE type="metal"/>
</SONGType>
<Date/>
</SONG>
<SONG>
<songStatus>
<ESP_SONGSTATUS name="Available"/>
</songStatus>
<SONGType>
<ESP_SONGTYPE type="metal"/>
</SONGType>
<Date>
<ESP_DATE date="2022-03-20"/>
</Date>
</SONG>
</song>
</SONGSINALBUM>
</songsinalbum>
</ALBUM>
</albums>
我的 XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<Workbook>
<Styles>
<Style ss:ID="mydefault" ss:Name="mydefault">
<Font ss:FontName="Verdana" ss:Bold="0"/>
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
</Style>
</Styles>
<Worksheet ss:Name="Report">
<xsl:call-template name="ws_table"/>
</Worksheet>
</Workbook>
</xsl:template>
<xsl:template name="ws_table">
<Table>
<xsl:call-template name="headerrow"/>
<xsl:apply-templates select="albums/ALBUM" mode="datarow"/>
</Table>
</xsl:template>
<xsl:template name="headerrow">
<Row>
<!-- Date -->
<Cell>
<Data ss:Type="String">Date</Data>
</Cell>
<!-- test counting -->
<Cell>
<Data ss:Type="String">test counting</Data>
</Cell>
<!-- real count -->
<Cell>
<Data ss:Type="String">real count</Data>
</Cell>
</Row>
</xsl:template>
<xsl:template match="ALBUM" mode="datarow">
<xsl:variable name="InRange" select="translate(songsinalbum/SONGSINALBUM/song/SONG[songStatus/ESP_SONGSTATUS/@name='Prehistoric'][SONGType/ESP_SONGTYPE/@type='metal']/Date/ESP_DATE/@date,'-','') <= translate(closingDate/DATE/@date,'-','')"/>
<xsl:variable name="formateddate" select="number(concat
(substring(closingDate/DATE/@date, 1, 4),
substring(closingDate/DATE/@date, 6, 2),
substring(closingDate/DATE/@date, 9, 2)))
<=
number(concat
(substring(songsinalbum/SONGSINALBUM/song/SONG[songStatus/ESP_SONGSTATUS/@name='Prehistoric'][SONGType/ESP_SONGTYPE/@type='metal']/Date/ESP_DATE/@date, 1, 4),
substring(songsinalbum/SONGSINALBUM/song/SONG[songStatus/ESP_SONGSTATUS/@name='Prehistoric'][SONGType/ESP_SONGTYPE/@type='metal']/Date/ESP_DATE/@date, 6, 2),
substring(songsinalbum/SONGSINALBUM/song/SONG[songStatus/ESP_SONGSTATUS/@name='Prehistoric'][SONGType/ESP_SONGTYPE/@type='metal']/Date/ESP_DATE/@date, 9, 2)))" />
<Row>
<!-- Date -->
<Cell>
<Data ss:Type="String">
<xsl:value-of select="closingDate/DATE/@date"/>
</Data>
</Cell>
<!-- test counting -->
<Cell>
<Data ss:Type="String">
<xsl:value-of select="count(songsinalbum/SONGSINALBUM/song/SONG[songStatus/ESP_SONGSTATUS/@name='Prehistoric'][SONGType/ESP_SONGTYPE/@type='metal'])"/>
</Data>
</Cell>
<!-- songs what is -->
<Cell>
<Data ss:Type="String">
<xsl:value-of select="count($formateddate)"/>
</Data>
</Cell>
</Row>
</xsl:template>
</xsl:stylesheet>
输出应该是这样的: enter image description here
还有。截止日期可以更改,所以如果它像“2022-01-09”,那么“实际计数”值应该是“2”。
所以我做错了什么?
谢谢, 此致
考虑以下最小化示例:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/albums">
<results>
<xsl:for-each select="ALBUM">
<xsl:variable name="close-date" select="translate(closingDate/DATE/@date, '-', '')" />
<xsl:variable name="songs" select="songsinalbum/SONGSINALBUM/song/SONG" />
<xsl:variable name="songs-before" select="$songs[translate(Date/ESP_DATE/@date, '-', '') <= $close-date]" />
<songs>
<xsl:value-of select="count($songs)" />
</songs>
<songs-before>
<xsl:value-of select="count($songs-before)" />
</songs-before>
</xsl:for-each>
</results>
</xsl:template>
</xsl:stylesheet>
应用于您的 XML 示例输入时,结果将是:
<?xml version="1.0" encoding="UTF-8"?>
<results>
<songs>4</songs>
<songs-before>1</songs-before>
</results>
如果您将截止日期更改为 2022-01-09
,则结果将为:
<?xml version="1.0" encoding="UTF-8"?>
<results>
<songs>4</songs>
<songs-before>2</songs-before>
</results>