根据 XSLT 中的节点值生成新组 [英] Generate new group based on node value in XSLT

查看:26
本文介绍了根据 XSLT 中的节点值生成新组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 XSLT 的新手,我正在尝试根据节点值 eventType 创建新组,因此如果 eventTypealert,请创建新的集体活动.

I am new to XSLT, and I am trying to create new group based on node value eventType so if eventType is alert, create new group event.

我正在检查最后一个兄弟

I am checking for last sibling

输入 XML

<?xml version="1.0" encoding="UTF-8"?><Rowsets >
         
        <Row>
            <eventId>2</eventId>
            <plantId>1020</plantId>
            <workCenter>WC1</workCenter>
            <eventType>alert</eventType>
            <eventText>Downtime</eventText>
            <eventDesc>WorkcenterDown</eventDesc>
        </Row>
         <Row>
            <eventId>3</eventId>
            <plantId>1021</plantId>
            <workCenter>WC1</workCenter>
            <eventType>alert</eventType>
           
            <eventText>Downtime</eventText>
            <eventDesc>WorkcenterDown</eventDesc>
        </Row>
        <Row>
            <eventId>4</eventId>
            <plantId>1020</plantId>
            <workCenter>WC2</workCenter>
            <eventType>incident</eventType>
           
            <eventText>eventtext</eventText>
            <eventDesc>failed</eventDesc>
            
        </Row>
         <Row>
            
            <plantId>1020</plantId>
            <workCenter>WC2</workCenter>
            <eventType>incident</eventType>
          
            <eventText>Text</eventText>
            <eventDesc>failed</eventDesc>
            
        </Row>
    
</Rowsets>

预期输出:

<?xml version="1.0" encoding="UTF-8"?>
<Rowsets>
  
<Alert>
      <element>
         <Title>Downtime:DIA01</Title>
         <eventDesc>WorkcenterDown</eventDesc>
      </element>
      <element>
         <Title>Downtime:DIA01</Title>
         <eventDesc>WorkcenterDown</eventDesc>
      </element>
</Alert>
<Incident>
      <element>
         <Title>YAT &lt; 60%:DIA01</Title>
         <eventDesc>7 Parts in 60 minutes have failed</eventDesc>
      </element>
      <element>
         <Title>YAT &lt; 60%:DIA01</Title>
         <eventDesc>7 Parts in 60 minutes have failed</eventDesc>
      </element>
</Incident>
 
</Rowsets>

基于eventType,我想生成组.

我正在使用这个 XSLT:

I am using this XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8"
                indent="yes" />
    <xsl:template match="/">
        <Rowsets>
            <Rowset>
                <xsl:variable name="Type" select="'alert'"/>

        
                
                <xsl:for-each select="/Rowsets/Rowset/Row">
            
                        <xsl:choose>
                        <xsl:when test="$Type = eventType">
                    
                        
                             <element>
                             <xsl:variable name="text" select="eventText"/>
                             <xsl:variable name="WC" select="workCenter"/>
                                        <Title><xsl:value-of select="concat($text,':',$WC)" /></Title>
                                        <xsl:copy-of select="eventDesc"/>
                             
                             </element>
                             
                    
                        
                        </xsl:when>
                    
                        <xsl:otherwise>
                             <element>
                              <xsl:variable name="text" select="eventText"/>
                             <xsl:variable name="WC" select="workCenter"/>
                                        <Title><xsl:value-of select="concat($text,':',$WC)" /></Title>
                                        <xsl:copy-of select="eventDesc"/>
                             </element>
                                                
                        </xsl:otherwise>
                        </xsl:choose>
                </xsl:for-each>
                
            </Rowset>
        </Rowsets>
    </xsl:template>
</xsl:stylesheet>

需要帮助根据eventType

推荐答案

这是一个分组问题 - 并且是一个相当微不足道的问题.在 XSLT 2.0 中,您可以简单地执行以下操作:

This is a grouping problem - and a rather trivial one at that. In XSLT 2.0 you could do simply:

XSLT 2.0

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

<xsl:template match="Rowsets">
    <Rowsets>
        <xsl:for-each-group select="Row" group-by="eventType">
            <xsl:element name="{current-grouping-key()}">
                <xsl:for-each select="current-group()">
                    <element>
                        <Title>
                            <xsl:value-of select="eventText, workCenter" separator=":"/>
                        </Title>
                        <xsl:copy-of select="eventDesc"/>
                    </element>
                </xsl:for-each> 
            </xsl:element>
        </xsl:for-each-group>
    </Rowsets>
</xsl:template>

</xsl:stylesheet>

或者,只有两种可能的类型,您可以这样做:

Alternatively, with only two possible types, you could do:

XSLT 1.0

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

<xsl:template match="Rowsets">
    <Rowsets>
        <Alert>
            <xsl:apply-templates select="Row[eventType='alert']"/>
        </Alert>
        <Incident>
            <xsl:apply-templates select="Row[eventType='incident']"/>
        </Incident>
    </Rowsets>
</xsl:template>

<xsl:template match="Row">
    <element>
        <Title>
            <xsl:value-of select="eventText"/>
            <xsl:text>:</xsl:text>
            <xsl:value-of select="workCenter"/>
        </Title>
        <xsl:copy-of select="eventDesc"/>
    </element>
</xsl:template>

</xsl:stylesheet>

这是假设您不介意创建一个组,即使它是空的.否则你会这样做:

This is assuming you don't mind creating a group even if it is empty. Otherwise you would do:

<xsl:template match="Rowsets">
    <Rowsets>
        <xsl:variable name="alerts" select="Row[eventType='alert']"/>
        <xsl:variable name="incidents" select="Row[eventType='incident']"/>
        <xsl:if test="$alerts">
            <Alert>
                <xsl:apply-templates select="Row[eventType='alert']"/>
            </Alert>
        </xsl:if>
        <xsl:if test="$incidents">
            <Incident>
                <xsl:apply-templates select="Row[eventType='incident']"/>
            </Incident>
        </xsl:if>
    </Rowsets>
</xsl:template>


附言请注意,XML 区分大小写: 不同.

这篇关于根据 XSLT 中的节点值生成新组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆