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
Xslt 输出在最终文本输出中仅重复_Xslt_Duplicates - Fatal编程技术网

Xslt 输出在最终文本输出中仅重复

Xslt 输出在最终文本输出中仅重复,xslt,duplicates,Xslt,Duplicates,在通过XSL样式表运行XML之后,我试图在最终文本输出中为每个唯一值只输出一行。在我的研究中,我发现了distinct values函数,但我无法按照我想要的方式执行它 以下是我的XML: <Library> <Book> <Code>1</Code> <Title>MANAGEMENT</Title> </Book> <Book>

在通过XSL样式表运行XML之后,我试图在最终文本输出中为每个唯一值只输出一行。在我的研究中,我发现了distinct values函数,但我无法按照我想要的方式执行它

以下是我的XML:

<Library>
    <Book>
        <Code>1</Code>
        <Title>MANAGEMENT</Title>
    </Book>
    <Book>
        <Code>1</Code>
        <Title>MANAGEMENT</Title>
    </Book>
    <Book>
        <Code>1</Code>
        <Title>MANAGEMENT</Title>
    </Book>
    <Book>
        <Code>1</Code>
        <Title>MANAGEMENT</Title>
    </Book>
    <Book>
        <Code>1</Code>
        <Title>MANAGEMENT</Title>
    </Book>
    <Book>
        <Code>10</Code>
        <Title>MECHANICAL</Title>
    </Book>
    <Book>
        <Code>106</Code>
        <Title>TRANSPORTATION</Title>
    </Book>
</Library>
下面是我当前的XSL(不正确):


我现在的输出是:

1 |管理| 1 |管理| 1 |管理| 1 |管理| 10 |机械| 106 |运输|

但我希望是这样:

1 |管理| 10 |机械| 106 |运输|


我不知道如何使用不同值的语法到达我需要的地方。

一个使用
键和
生成-id()
函数()来获得不同值的XSLT 1.0解决方案:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="bookCode" match="/Library/Book/Code" use="." />

<xsl:template match="/">
    <xsl:for-each select="/Library/Book/Code[generate-id()
                                   = generate-id(key('bookCode',.)[1])]">

        <xsl:value-of select="this:fixedOutput(.)" />
        <xsl:value-of select="this:fixedOutput(../Title)" />
        <xsl:value-of select="$linefeed" />
    </xsl:for-each>
</xsl:template>

注意:在您的代码中,As
this:fixedOutput
不引用任何名称空间,它已按原样使用

请参阅:

如果您使用的是XSLT2.0(看起来是这样),那么请为每个组尝试
xsl:for
。这里有很多例子。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="bookCode" match="/Library/Book/Code" use="." />

<xsl:template match="/">
    <xsl:for-each select="/Library/Book/Code[generate-id()
                                   = generate-id(key('bookCode',.)[1])]">

        <xsl:value-of select="this:fixedOutput(.)" />
        <xsl:value-of select="this:fixedOutput(../Title)" />
        <xsl:value-of select="$linefeed" />
    </xsl:for-each>
</xsl:template>
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
</xsl:template>

<xsl:template match="Library">
    <xsl:for-each-group select="Book" group-by="concat(Code,Title)">
        <xsl:apply-templates select="." />
    </xsl:for-each-group>
</xsl:template>

<xsl:template match="Book">
    <xsl:value-of select="this:fixedOutput(Code)" />
    <xsl:value-of select="this:fixedOutput(Title)" />
    <xsl:value-of select="$linefeed" />
</xsl:template>