Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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/ionic-framework/2.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
将XML记录组合成有意义的句子;戴尔、哈利和露西;_Xml_Xslt - Fatal编程技术网

将XML记录组合成有意义的句子;戴尔、哈利和露西;

将XML记录组合成有意义的句子;戴尔、哈利和露西;,xml,xslt,Xml,Xslt,假设我有XML格式的 <people> <name>Dale</name> <name>Harry</name> <name>Lucy</name> </people> 仅仅使用XSLT?它必须在一定程度上具有灵活性,以便在有更多names的地方仍然有意义 Dale, Harry, Lucy, James, Andy, Shelly and Norma 这个问题很相似,但不

假设我有XML格式的

<people>
    <name>Dale</name>
    <name>Harry</name>
    <name>Lucy</name>
</people>
仅仅使用XSLT?它必须在一定程度上具有灵活性,以便在有更多
name
s的地方仍然有意义

Dale, Harry, Lucy, James, Andy, Shelly and Norma

这个问题很相似,但不完全相同。唯一需要添加的是第二个条件,它决定何时插入

XML输入

<people>
    <name>Dale</name>
    <name>Harry</name>
    <name>Lucy</name>
    <name>John</name>
</people>
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="text"/>

    <xsl:strip-space elements="*"/>

    <xsl:template match="name">
        <xsl:variable name="pos" select="position()"/>

        <xsl:if test="$pos = last() and $pos != 1">
            <xsl:text> and </xsl:text>
        </xsl:if>

        <xsl:value-of select="."/>

        <xsl:if test="$pos != last() and $pos + 1 != last()">
            <xsl:text>, </xsl:text>
        </xsl:if>
    </xsl:template>

</xsl:transform>
Dale, Harry, Lucy and John

或者,如果您喜欢隐式代码,但行数较少,则可以使用单个XPath表达式(XSLT 1.0)完成:


这个问题非常类似,但不完全相同。唯一需要添加的是第二个条件,它决定何时插入

XML输入

<people>
    <name>Dale</name>
    <name>Harry</name>
    <name>Lucy</name>
    <name>John</name>
</people>
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="text"/>

    <xsl:strip-space elements="*"/>

    <xsl:template match="name">
        <xsl:variable name="pos" select="position()"/>

        <xsl:if test="$pos = last() and $pos != 1">
            <xsl:text> and </xsl:text>
        </xsl:if>

        <xsl:value-of select="."/>

        <xsl:if test="$pos != last() and $pos + 1 != last()">
            <xsl:text>, </xsl:text>
        </xsl:if>
    </xsl:template>

</xsl:transform>
Dale, Harry, Lucy and John

或者,如果您喜欢隐式代码,但行数较少,则可以使用单个XPath表达式(XSLT 1.0)完成:


试试:


和
, 
试试:


和
, 

可能只是一个快速提醒的重复——尽管我知道stack exchange讨厌异地引用——有一个xslt常见问题解答网站,通过搜索该短语可以轻松找到,该网站包含xsl Mail lisr最初几年的所有最佳提示,当该工具还是新工具时。对于以前的解决方案来说,它仍然是一个很好的资源,包括一些我们认为XSLT1.0无法实现的功能!可能只是一个快速提醒的重复——虽然我知道stack exchange讨厌异地引用——有一个xslt常见问题解答网站,通过搜索该短语可以轻松找到,该网站包含xsl Mail lisr最初几年的所有最佳提示,当此工具还是新工具时。对于以前的解决方案来说,它仍然是一个很好的资源,包括一些我们认为XSLT1.0无法实现的功能@michael.hor257k编辑了答案。现在它也适用于一个
名称
——不过我更喜欢您的解决方案。@michael.hor257k编辑了答案。现在它也适用于单个
名称
——不过我更喜欢您的解决方案。