簡體   English   中英

XSLT使用for-each來應用模板

[英]XSLT using for-each to apply templates

因此,我之前提了一個問題: XSLT選擇具有不同名稱空間的多個節點

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:head="http://www/example.com">
  <soap:Header>
      <head:sampleHeaderType>
        <head:messageId>xxxxxxxx</head:messageId>
         <head:SID>XXX</head:SID>
         <head:BID>SP</head:BID>
         <head:CTS>2014-09-26T13:19:30.534Z</head:CTS>      
      </head:sampleHeaderType>
   </soap:Header>
   <soap:Body>
      <cass:SPD xmlns:cass="http://blahblahblah">
         <cass:SPR>
            <cass:RQ RT="Describe" FG="LOL" PD="09/22/2014" />
         </cass:SPR>
         <cass:SPS>
            <cass:SP SPT="Standard" FT="Retail" PS="New" ICT="APR" >
               <cass:DR DN="306532" BR="0.0790000">
                  <cass:FFMR ValueType="$" Value="0"/>
                  <cass:RV ReserveType="DP">
                     <cass:RTS TT="DP">
                        <cass:RT TMin="0" TMax="0.999999" TVT="%" TV="100"/>
                     </cass:RTS>
                  </cass:RV>
               </cass:DR>
               <cass:Product PID="Sirius" PN="Sirius"/>
            </cass:SP>
            <cass:SP SPT="Standard" FT="Retail" PS="New" ICT="APR">
               <cass:DR DN="306532" BR="0.1520000">
                  <cass:FFMR ValueType="$" Value="0"/>
                  <cass:RV RT="DP">
                     <cass:RTS TT="DP">
                        <cass:RT TMin="0" TMax="0.999999" TVT="%" TV="100"/>
                     </cass:RTS>
                  </cass:RV>
               </cass:DR>
               <cass:Product PID="Sirius" PN="Sirius"/>
            </cass:SP>
         </cass:SPS>
         <cass:SPMS>
            <cass:SPM MessageCode="" MessageType="" MessageText=""/>
         </cass:SPMS>
</cass:SPD>
   </soap:Body>
</soap:Envelope>

現在我有了樣式表

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:cass="http://blahblahblah" xmlns:head="http://www/example.com" exclude-result-prefixes="soap cass head">
   <xsl:output method="xml" indent="yes"/>
   <xsl:template match="soap:Header" />
   <xsl:template match="cass:SPD">
            <xsl:for-each select=".//cass:SP">
                <xsl:apply-templates select="*/cass:SPM"/>
                <xsl:apply-templates select="*/cass:RQ"/>
                <xsl:apply-templates select="*/cass:SP"/>
            </xsl:for-each>
        </xsl:template>


        <xsl:template match="*/cass:RQ">
        <RT>
            <xsl:value-of select="@RT"/>
        </RT>
        <FG>
            <xsl:value-of select="@FG"/>
        </FG>
        <PD>
            <xsl:value-of select="@PD"/>
        </PD>
        </xsl:template>

        <xsl:template match="*/cass:SPM">
            <MESSAGE_TXT>
                <xsl:value-of select="@MessageText"/>
            </MESSAGE_TXT>
        </xsl:template>
</xsl:stylesheet>

因此,基本上,我想為每個cass:SP生成單獨的EVAPP_SP元素,該元素具有從xml的不同部分中選擇的節點。 我希望這很清楚,我不善於表達這個問題。

模板匹配cass:SPD時出現問題

<xsl:template match="cass:SPD">
    <xsl:for-each select=".//cass:SP">
        <xsl:apply-templates select="*/cass:SPM"/>
        <xsl:apply-templates select="*/cass:RQ"/>
        <xsl:apply-templates select="*/cass:SP"/>
    </xsl:for-each>
</xsl:template>

因此,在模板中,您最初位於cass:SPD 然后,您可以進行一次for-each以獲得此級別下的cass:SP 到現在為止還挺好。 但是然后您使用xpath表達式*/cass:SPM 因為在循環中您的上下文現在位於cass:SP ,所以它將查找cass:SP的子級的cass:SP cass:SPM元素。 但是沒有。 cass:SPMcass:SPDcass:SPD cass:SR同樣如此。

在不知道您希望獲得什么輸出的情況下很難給出准確的答案,但是有可能實際上根本不需要for-each

<xsl:template match="cass:SPD">
    <xsl:apply-templates select="*/cass:SPM"/>
    <xsl:apply-templates select="*/cass:RQ"/>
    <xsl:apply-templates select="*/cass:SP"/>
</xsl:template>

這至少會產生一些輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM