代码之家  ›  专栏  ›  技术社区  ›  membersound

如何根据列表索引条件使用XSLT提取XML?

  •  0
  • membersound  · 技术社区  · 7 年前

    <segment> 这可能在一个系统内发生2-4次 <list> . 如何访问基于索引的段以将其作为 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>
    

    我的目标是:提取中间部分,如果不存在,则留空。所需的输出将是:

    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
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Tim C    7 年前

    如果您不具备忽略第一段和最后一段的逻辑,那么您实际上应该这样做。。。

    <xsl:for-each select="//list">
        <xsl:value-of select="segment/origin" separator=";"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
    

    若要忽略第一个和最后一个,但尚未添加空白条目,请执行以下操作。。。

    <xsl:for-each select="//list">
        <xsl:value-of select="segment[not(position() = (1, last()))]/origin" separator=";"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
    

    若要添加空白条目,假设每个列表中确实不超过4个段,请执行以下操作。。。

    <xsl:variable name="blank" select='"&apos;&apos;"' />
    <xsl:for-each select="//list">
        <xsl:value-of select="(segment[not(position() = (1, last()))]/origin, $blank, $blank)[position() le 2]" separator=";"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
    
    推荐文章