Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据列表索引条件使用XSLT提取XML?_Xml_Xslt_Saxon - Fatal编程技术网

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

如何根据列表索引条件使用XSLT提取XML?,xml,xslt,saxon,Xml,Xslt,Saxon,我有一个列表,可以在中出现2-4次。如何访问基于索引的段,以便将其解析为csv字符串 例如: <root> <list> <segment> <origin>new york</origin> </segment> <segment> <origin>san francisco</origin> </segment>

我有一个列表
,可以在
中出现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>
因此,第一段和最后一段应始终忽略。中间的所有段都应提取
标记。如果中间没有段,则应添加空字段

<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如果您没有忽略第一个和最后一个段的逻辑,那么实际上应该这样做

<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>
<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>



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

<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>
<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>



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

<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>
<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>




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

<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>
<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>



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

<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>
<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>



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

<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>
<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>




最后一个
[position()le 2]
是干什么的?你能再解释一下吗?表达式
(段[not(position()=(1,last()))]/origin,$blank,$blank)
选择所有
origin
元素(第一个和最后一个除外),加上两个空白字符串,因此最多可以返回4项。如果总共只有3个
origin
元素,则此表达式返回3项(中间的
origin
加上两个空白字符串)。但您的CSV中每行只需要两项,因此它只会获取此列表中的前两项。(
le
顺便说一下,表示“小于或等于”).最后一个
[position()le 2]
是干什么的?你能再解释一下吗?表达式
(段[not(position()=(1,last()))]/origin,$blank,$blank)
选择所有
origin
元素(第一个和最后一个除外),加上两个空白字符串,因此最多可以返回4项。如果总共只有3个
origin
元素,则此表达式返回3项(中间的
origin
加上两个空白字符串)。但您的CSV中每行只需要两项,因此它只会获取此列表中的前两项。(
le
顺便说一下,表示“小于或等于”).