基于 XSLT 中的节点值生成新组

Generate new group based on node value in XSLT

我是 XSLT 新手,我正在尝试根据节点值 eventType 创建新组,因此如果 eventTypealert,请创建新组事件。

我正在检查最后一个兄弟姐妹

输入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:

<?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

的 ID 和密钥

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

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>

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

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>

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

<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>

P.S。请注意 XML 区分大小写:<Alert><alert> 不同。