Xml 界定xslt的输出(在非常重要的情况下)

Xml 界定xslt的输出(在非常重要的情况下),xml,xslt,delimiter,Xml,Xslt,Delimiter,我想知道在xsl转换中分隔xml输出的最佳方法。位置!=last并不总是有效的,因为它对输入进行假设 此玩具示例演示: <xsl:template match="/"> <html> <body> <xsl:for-each select="//cd"> <xsl:if test="title !='Unchain my heart'"> <xsl

我想知道在xsl转换中分隔xml输出的最佳方法。位置!=last并不总是有效的,因为它对输入进行假设

此玩具示例演示:

  <xsl:template match="/">
    <html>
      <body>
        <xsl:for-each select="//cd">
          <xsl:if test="title !='Unchain my heart'">
            <xsl:value-of select="title" />
            <xsl:if test="position() != last()">
              <xsl:text>; </xsl:text>  <!-- sometimes the delimiter will end if last element is a duplicate; -->
            </xsl:if>
          </xsl:if>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
注意后面的分号

有什么想法吗


本例中的xml数据

一种方法是对xml进行预扫描,以将其管道化为更好的结构

这里的概念是创建自己的XML,然后将其作为与源XML分离的节点集进行评估。这是通过EXSLT的节点集方法实现的

我刚刚结束了这次训练,希望能有所帮助。正如您所看到的,没有尾随冒号


一种方法是对XML进行预扫描,以将其管道化为更好的结构

这里的概念是创建自己的XML,然后将其作为与源XML分离的节点集进行评估。这是通过EXSLT的节点集方法实现的

我刚刚结束了这次训练,希望能有所帮助。正如您所看到的,没有尾随冒号


您可以做的一件事是使用以下::axis查看您是否在最后一个标题中

例如:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <html>
            <body>
                <xsl:apply-templates select="catalog/cd/title[. != 'Unchain my heart']"/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="title">
        <xsl:value-of select="."/>
        <xsl:if test="following::cd/title[. != 'Unchain my heart']">
            <xsl:text>; </xsl:text>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <html>
            <body>
                <xsl:value-of select="catalog/cd/title[. != 'Unchain my heart']" separator="; "/>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>
//cd[title != 'Unchain my heart']
此外,如果您试图删除Unchain my heart标题,请尝试将其放在谓词中,而不是放在xsl中:如果它没有错,那么执行相同操作的效率会降低,代码也会增加很多

例如:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <html>
            <body>
                <xsl:apply-templates select="catalog/cd/title[. != 'Unchain my heart']"/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="title">
        <xsl:value-of select="."/>
        <xsl:if test="following::cd/title[. != 'Unchain my heart']">
            <xsl:text>; </xsl:text>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <html>
            <body>
                <xsl:value-of select="catalog/cd/title[. != 'Unchain my heart']" separator="; "/>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>
//cd[title != 'Unchain my heart']


您可以做的一件事是使用以下::axis查看您是否在最后一个标题中

例如:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <html>
            <body>
                <xsl:apply-templates select="catalog/cd/title[. != 'Unchain my heart']"/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="title">
        <xsl:value-of select="."/>
        <xsl:if test="following::cd/title[. != 'Unchain my heart']">
            <xsl:text>; </xsl:text>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <html>
            <body>
                <xsl:value-of select="catalog/cd/title[. != 'Unchain my heart']" separator="; "/>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>
//cd[title != 'Unchain my heart']
此外,如果您试图删除Unchain my heart标题,请尝试将其放在谓词中,而不是放在xsl中:如果它没有错,那么执行相同操作的效率会降低,代码也会增加很多

例如:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <html>
            <body>
                <xsl:apply-templates select="catalog/cd/title[. != 'Unchain my heart']"/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="title">
        <xsl:value-of select="."/>
        <xsl:if test="following::cd/title[. != 'Unchain my heart']">
            <xsl:text>; </xsl:text>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <html>
            <body>
                <xsl:value-of select="catalog/cd/title[. != 'Unchain my heart']" separator="; "/>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>
//cd[title != 'Unchain my heart']

将其更改为:

    <xsl:for-each select="//cd[title !='Unchain my heart']">
        <xsl:value-of select="title" />
        <xsl:if test="position() != last()">
          <xsl:text>; </xsl:text>
        </xsl:if>
    </xsl:for-each>
或者在XSLT2.0中

<xsl:value-of select="//cd/title[. !='Unchain my heart']" separator="; "/>
将其更改为:

    <xsl:for-each select="//cd[title !='Unchain my heart']">
        <xsl:value-of select="title" />
        <xsl:if test="position() != last()">
          <xsl:text>; </xsl:text>
        </xsl:if>
    </xsl:for-each>
或者在XSLT2.0中

<xsl:value-of select="//cd/title[. !='Unchain my heart']" separator="; "/>

谢谢糟糕的是,它增加了如此多的复杂性。操场看起来很有帮助。谢谢。糟糕的是,它增加了如此多的复杂性。游乐场网站看起来很有帮助。我认为正是这种情况使这种方法成了问题。@user833970-我刚刚添加了一条评论,但是,如果您愿意,我可以更新实际的样式表。@user833970-更新了两个示例。我认为正是这种情况使此方法有问题。@user833970-我刚刚添加了一条关于此的注释,但是如果您愿意,我可以更新实际的样式表。@user833970-更新了两个示例。