如何根据列表索引条件用XSLT提取XML?
How to extract XML with XSLT based on list index condition?
我有一个列表 <segment>
,它可以在 <list>
中出现 2-4 次。如何访问基于索引的段以将它们解析为 csv
字符串?
示例:
<root>
<list>
<segment>
<origin>new york</origin>
</segment>
<segment>
<origin>san francisco</origin>
</segment>
<segment>
<origin>London</origin>
</segment>
<segment>
<origin>Berlin</origin>
</segment>
</list>
<list>
<segment>
<origin>new york</origin>
</segment>
<segment>
<origin>Berlin</origin>
</segment>
</list>
</root>
我的目标:提取中间段,如果 none 存在则留空。所需的输出将是:
sanfrancisco;london //both segments 2 + 3 filled
'';'' //both segments 2 + 3 empty
所以第一段和最后一段应该总是被忽略。中间的所有段都应提取 <origin>
标记。如果中间没有段,则应添加空字段。
<xsl:template match="root">
<xsl:for-each select="//list//segment">
<!-- of course this is wrong, because it selects just all origins. -->
<xsl:value-of select=".//origin" separator=";"/>
</xsl:for-each>
</xsl:template>
问题:如何将以下内容翻译成 xslt(伪代码):
if (segment.size <= 2) write '';''
if (segment.size <= 3) write segment[1].origin;''
if (segment.size <= 4) write segment[1].origin;segment[2].origin
如果您没有忽略第一个和最后一个片段的逻辑,您实际上应该这样做...
<xsl:for-each select="//list">
<xsl:value-of select="segment/origin" separator=";"/>
<xsl:text> </xsl:text>
</xsl:for-each>
要忽略第一个和最后一个,但还没有添加空白条目,您可以这样做...
<xsl:for-each select="//list">
<xsl:value-of select="segment[not(position() = (1, last()))]/origin" separator=";"/>
<xsl:text> </xsl:text>
</xsl:for-each>
要添加空白条目,假设每个列表确实不超过 4 个段,请执行此操作...
<xsl:variable name="blank" select='"''"' />
<xsl:for-each select="//list">
<xsl:value-of select="(segment[not(position() = (1, last()))]/origin, $blank, $blank)[position() le 2]" separator=";"/>
<xsl:text> </xsl:text>
</xsl:for-each>
我有一个列表 <segment>
,它可以在 <list>
中出现 2-4 次。如何访问基于索引的段以将它们解析为 csv
字符串?
示例:
<root>
<list>
<segment>
<origin>new york</origin>
</segment>
<segment>
<origin>san francisco</origin>
</segment>
<segment>
<origin>London</origin>
</segment>
<segment>
<origin>Berlin</origin>
</segment>
</list>
<list>
<segment>
<origin>new york</origin>
</segment>
<segment>
<origin>Berlin</origin>
</segment>
</list>
</root>
我的目标:提取中间段,如果 none 存在则留空。所需的输出将是:
sanfrancisco;london //both segments 2 + 3 filled
'';'' //both segments 2 + 3 empty
所以第一段和最后一段应该总是被忽略。中间的所有段都应提取 <origin>
标记。如果中间没有段,则应添加空字段。
<xsl:template match="root">
<xsl:for-each select="//list//segment">
<!-- of course this is wrong, because it selects just all origins. -->
<xsl:value-of select=".//origin" separator=";"/>
</xsl:for-each>
</xsl:template>
问题:如何将以下内容翻译成 xslt(伪代码):
if (segment.size <= 2) write '';''
if (segment.size <= 3) write segment[1].origin;''
if (segment.size <= 4) write segment[1].origin;segment[2].origin
如果您没有忽略第一个和最后一个片段的逻辑,您实际上应该这样做...
<xsl:for-each select="//list">
<xsl:value-of select="segment/origin" separator=";"/>
<xsl:text> </xsl:text>
</xsl:for-each>
要忽略第一个和最后一个,但还没有添加空白条目,您可以这样做...
<xsl:for-each select="//list">
<xsl:value-of select="segment[not(position() = (1, last()))]/origin" separator=";"/>
<xsl:text> </xsl:text>
</xsl:for-each>
要添加空白条目,假设每个列表确实不超过 4 个段,请执行此操作...
<xsl:variable name="blank" select='"''"' />
<xsl:for-each select="//list">
<xsl:value-of select="(segment[not(position() = (1, last()))]/origin, $blank, $blank)[position() le 2]" separator=";"/>
<xsl:text> </xsl:text>
</xsl:for-each>