遍历相似的XML节点/子节点以进行XSL转换

时间:2019-11-15 03:09:26

标签: xml xslt

我对XSL转换还比较陌生。

我的输入XML如下:

<?xml version="1.0" encoding="UTF-8"?>
<PublishVS_PPWO xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creationDateTime="2019-11-15T11:55:15+11:00" transLanguage="EN" baseLanguage="EN" messageID="2887862.1573779314727427868" maximoVersion="7 6 20170418-0100 V7608-61" event="1">
  <VS_PPWOSet>
    <WORKORDER action="Replace">
      <SITEID>SITE51</SITEID>
      <STATUS changed="1" maxvalue="COMP">COMP</STATUS>
      <STATUSDATE changed="1">2019-11-15T11:55:06+11:00</STATUSDATE>
      <WONUM>PW1024</WONUM>
      <FAILUREREPORT>
        <FAILURECODE>NDT</FAILURECODE>
        <FAILUREREPORTID>1704590</FAILUREREPORTID>
        <TYPE maxvalue="PROBLEM">PROBLEM</TYPE>
      </FAILUREREPORT>
      <FAILUREREPORT>
        <FAILURECODE>LINE</FAILURECODE>
        <FAILUREREPORTID>1704591</FAILUREREPORTID>
        <TYPE maxvalue="CAUSE">CAUSE</TYPE>
      </FAILUREREPORT>
      <FAILUREREPORT>
        <FAILURECODE>PASS</FAILURECODE>
        <FAILUREREPORTID>1704592</FAILUREREPORTID>
        <TYPE maxvalue="REMEDY">REMEDY</TYPE>
      </FAILUREREPORT>
    </WORKORDER>
  </VS_PPWOSet>
</PublishVS_PPWO>

XSLT如下:

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


    <xsl:template match="/">
        <xsl:apply-templates select="mea:PublishVS_PPWO"/>
    </xsl:template>

    <xsl:template match="mea:PublishVS_PPWO">
        <xsl:apply-templates select="mea:VS_PPWOSet"/>
    </xsl:template>

    <xsl:template match="mea:VS_PPWOSet">
        <xsl:apply-templates select="mea:WORKORDER"/>
    </xsl:template>


    <xsl:template match="mea:WORKORDER">
        <ExecuteMultipleOperations xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <Operations>
                <Operation xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                    <Object>
                        <Object xsi:type="Task">
                            <xsl:apply-templates select="mea:WONUM" />
                            <xsl:call-template name="formatDateTime">
                            <xsl:with-param name="dateTime" select="mea:STATUSDATE" />
                            </xsl:call-template>
                            <xsl:call-template name="TLS"></xsl:call-template>
                            <xsl:apply-templates select="mea:FAILUREREPORT[mea:TYPE='PROBLEM']/mea:FAILURECODE" />
                            <xsl:apply-templates select="mea:FAILUREREPORT[mea:TYPE='CAUSE']/mea:FAILURECODE" />
                            <xsl:apply-templates select="mea:FAILUREREPORT[mea:TYPE='REMEDY']/mea:FAILURECODE" />
                            <xsl:call-template name="TLS2"></xsl:call-template>
                        </Object>
                    </Object>
                </Operation>
            </Operations>   
        </ExecuteMultipleOperations>
    </xsl:template>

    <xsl:template match="mea:WONUM">
        <ExternalRefID><xsl:value-of select="." /></ExternalRefID>
        <Status>Completed</Status>
    </xsl:template>
    <xsl:template name="formatDateTime">
     <xsl:param name="dateTime" />
     <xsl:variable name="date">
     <xsl:value-of select="substring-before($dateTime, 'T')" />
     </xsl:variable>
     <xsl:variable name="time">
     <xsl:value-of select="substring-before(substring-after($dateTime, 'T'), '+')" />
     </xsl:variable>
     <CompletionDate><xsl:value-of select="concat($date,' ',$time)" /></CompletionDate>
    </xsl:template>
    <xsl:template name="TLS">
     <TLSMissedAppointmentReason></TLSMissedAppointmentReason>
     <TLSMissedCommitmentReason></TLSMissedCommitmentReason>
     <TLSAction></TLSAction>
    </xsl:template>
    <xsl:template match="mea:FAILUREREPORT[mea:TYPE='PROBLEM']/mea:FAILURECODE">
        <TLSClearanceCode1><xsl:value-of select="." /></TLSClearanceCode1>
    </xsl:template>
    <xsl:template match="mea:FAILUREREPORT[mea:TYPE='CAUSE']/mea:FAILURECODE">
        <TLSClearanceCode2><xsl:value-of select="." /></TLSClearanceCode2>
    </xsl:template>
    <xsl:template match="mea:FAILUREREPORT[mea:TYPE='REMEDY']/mea:FAILURECODE">
        <TLSClearanceCode3><xsl:value-of select="." /></TLSClearanceCode3>
    </xsl:template>
    <xsl:template name="TLS2">
     <TLSRestorationTime></TLSRestorationTime>
     <TLSCompletionRemarks></TLSCompletionRemarks>
    </xsl:template>
</xsl:stylesheet>

但是,输出XML无法获取FAILURECODE的值。 所以我的问题是是否是mea:FAILUREREPORT [mea:TYPE ='PROBLEM'] / mea:FAILURECODE 足以达到FAILURECODE的价值?

感谢您的帮助。

请忽略以下内容:) XSLT(可扩展样式表语言转换)是一种用于将XML文档转换为其他XML文档或其他格式(如网页HTML,纯文本或XSL格式对象)的语言,随后可以将其转换为其他格式,如PDF,PostScript和PNG。

0 个答案:

没有答案
相关问题