XSLT:变量中的过滤器/组节点

时间:2017-05-15 16:55:09

标签: variables xslt xslt-2.0 xslt-grouping

我正在尝试过滤/分组变量中的节点。

XML:

BufferedImage offImage = (BufferedImage)createImage( getWidth(), getHeight());
Graphics2D    g2       = offImage.createGraphics();
g2.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
g2.setRenderingHint( RenderingHints.KEY_RENDERING   , RenderingHints.VALUE_RENDER_QUALITY );
paintComponent( g2 );
paintChildren( g2 );
ImageIO.write( offImage, "png", "snapshot.png" );

XSLT 2:

<?xml version="1.0" encoding="UTF-8"?>
<row>
    <cell n="1"/>
    <cell n="2"/>
    <cell n="3"/>
    <cell n="4"/>
    <cell n="2"/>
    <cell n="5"/>
</row>

预期输出:

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

    <xsl:template match="row">
        <xsl:element name="row">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>   

    <xsl:template match="cell">
        <xsl:variable name="attribute" select="@n"/>
        <xsl:variable name="sequence">
            <xsl:call-template name="seq">
                <xsl:with-param name="attribute" select="$attribute"/>
            </xsl:call-template>
        </xsl:variable>
        <xsl:for-each-group select="$sequence" group-by="cell/@val">
            <xsl:sequence select="."></xsl:sequence>
        </xsl:for-each-group>
    </xsl:template>

    <xsl:template name="seq">
        <xsl:param name="attribute"/>
        <xsl:element name="cell">
            <xsl:attribute name="val">
                <xsl:value-of select="$attribute"/>
            </xsl:attribute>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

XML代码只是一个更复杂的文件的例子。我想要做的是首先处理所有元素<?xml version="1.0" encoding="UTF-8"?> <row> <cell val="1"/> <cell val="2"/> <cell val="3"/> <cell val="4"/> <cell val="5"/> </row> 并将结果保存在变量中。在第二次运行中,我想过滤或重新组合序列的节点。

我还尝试使用谓词过滤cell

$sequence

在这种情况下,输出文件为空。

编辑2(现在可行):

<xsl:sequence select="$sequence/*[@val != preceding-sibling::cell/@val]"/> 

<?xml version="1.0" encoding="UTF-8"?>

1 个答案:

答案 0 :(得分:1)

这是一个XSLT 2.0样式表,首先将<cell n="x">...</cell>转换为<cell val="n">...</cell>,然后按val属性对这些单元格元素进行分组,以消除重复:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:output indent="yes"/>

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

    <xsl:template match="row">
        <xsl:copy>
            <xsl:variable name="transformed-cells">
                <xsl:apply-templates select="cell"/>
            </xsl:variable>
            <xsl:for-each-group select="$transformed-cells/cell" group-by="@val">
                <xsl:copy-of select="."/>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="cell/@n">
        <xsl:attribute name="val" select="."/>
    </xsl:template>

</xsl:transform>

输出

<row>
   <cell val="1"/>
   <cell val="2"/>
   <cell val="3"/>
   <cell val="4"/>
   <cell val="5"/>
</row>

http://xsltransform.net/a9Giwz