在 xslt 中读取一个变量值

Read a variable value in xslt

我在将变量值从 Header 标记读取到 LineDetail 标记时遇到问题。我需要根据这个变量值做条件映射。 谁能帮我解决这个问题?

下面是我的转换规则示例,我需要读取 LineDetail 标签中变量 $varPOFlag 的值。

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" version="1.0" exclude-result-prefixes="msxsl">
        <xsl:output method="xml" indent="yes" />
        <xsl:template match="Invoice">          
            <Invoice>       
            <Header>
                <!-- Read the PONumber if exists  -->
                <xsl:variable name="varHeaderPONumber">
                    <xsl:choose>
                    <xsl:when test="./Header/PONumber != ''">                       
                        <xsl:value-of select="./Header/PONumber" />
                    </xsl:when>
                    </xsl:choose>
                </xsl:variable> 
                <!-- If PONumber does not exists in <Header> check at each lineItem level  -->
                <xsl:variable name="varLinePONumber">   
                    <xsl:choose>
                    <xsl:when test="not(./Header/PONumber)" >
                        <xsl:for-each select="./LineDetail">                        
                            <xsl:if test="position()=1">                                
                                <xsl:value-of select="./PONumber" />                                                            
                            </xsl:if>                               
                        </xsl:for-each> 
                    </xsl:when>
                    </xsl:choose>                   
                </xsl:variable>             
                <!--check if <Header.PONumber> matches with each <LineDetail.PONumber> -->
                <xsl:variable name ="var1212">
                    <xsl:choose>
                    <xsl:when test="$varHeaderPONumber != ''">                                                  
                    <xsl:for-each select = "./LineDetail">                              
                        <xsl:choose>
                        <xsl:when test="./PONumber !=''" >                                      
                            <xsl:choose>
                            <xsl:when test= "$varHeaderPONumber !=./PONumber">
                                <xsl:value-of select="'DoesNotMatch'"/>
                            </xsl:when>                                         
                            </xsl:choose>                                   
                        </xsl:when>                                 
                        </xsl:choose>                           
                    </xsl:for-each> 
                    </xsl:when> 
                    </xsl:choose>
                </xsl:variable> 
                <!-- set the varPOFlag = 0 /1 if PONumber exists / does not exist -->
                <xsl:variable name="varPOFlag">
                    <xsl:choose>
                    <xsl:when test="$varHeaderPONumber!='' or $varLinePONumber != ''">
                        <xsl:value-of select='1'/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select='0'/>
                    </xsl:otherwise>
                    </xsl:choose>               
                </xsl:variable>             
            </Header>
            <LineDetail>
                    <!--Here I Need to read the value of variable $varPOFlag -->
                    <xsl:choose>
                    <xsl:when test="$varPOFlag=0">
                        <xsl:value-of select="'Number'"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="'Description'"/>
                    </xsl:otherwise>
                    </xsl:choose>
            </LineDetail>
            </Invoice>
        </xsl:template>
    </xsl:stylesheet>

下面是示例输出。

<?xml version="1.0" encoding="UTF-8"?>
<Invoice>
   <Header>      
      <PONumber />
      <ScanComments>One or more PO#s were detected at the Line Item level. Please select one PO# for the Header PO# value</ScanComments>
      <POFlag>1</POFlag>
      <DocumentSubType>PO-3Way</DocumentSubType>
      <BuyerName />
   </Header>
</Invoice>

XSLT 中的变量是词法范围内的 - 您不能引用在您的兄弟元素之一内声明的变量。但是由于像 <Header> 这样的文字结果元素不会改变上下文,所以将所有变量声明从 Header 内部向上移动一两个级别是安全的 - 如果将它们放在 Invoice 那么它们将可以在 LineDetailHeader:

内部访问
    <xsl:template match="Invoice">          
        <Invoice>       
            <!-- Read the PONumber if exists  -->
            <xsl:variable name="varHeaderPONumber">
                <xsl:choose>
                <xsl:when test="./Header/PONumber != ''">                       
                    <xsl:value-of select="./Header/PONumber" />
                </xsl:when>
                </xsl:choose>
            </xsl:variable> 
            <!-- If PONumber does not exists in <Header> check at each lineItem level  -->
            <xsl:variable name="varLinePONumber">   
                <xsl:choose>
                <xsl:when test="not(./Header/PONumber)" >
                    <xsl:for-each select="./LineDetail">                        
                        <xsl:if test="position()=1">                                
                            <xsl:value-of select="./PONumber" />                                                            
                        </xsl:if>                               
                    </xsl:for-each> 
                </xsl:when>
                </xsl:choose>                   
            </xsl:variable>             
            <!--check if <Header.PONumber> matches with each <LineDetail.PONumber> -->
            <xsl:variable name ="var1212">
                <xsl:choose>
                <xsl:when test="$varHeaderPONumber != ''">                                                  
                <xsl:for-each select = "./LineDetail">                              
                    <xsl:choose>
                    <xsl:when test="./PONumber !=''" >                                      
                        <xsl:choose>
                        <xsl:when test= "$varHeaderPONumber !=./PONumber">
                            <xsl:value-of select="'DoesNotMatch'"/>
                        </xsl:when>                                         
                        </xsl:choose>                                   
                    </xsl:when>                                 
                    </xsl:choose>                           
                </xsl:for-each> 
                </xsl:when> 
                </xsl:choose>
            </xsl:variable> 
            <!-- set the varPOFlag = 0 /1 if PONumber exists / does not exist -->
            <xsl:variable name="varPOFlag">
                <xsl:choose>
                <xsl:when test="$varHeaderPONumber!='' or $varLinePONumber != ''">
                    <xsl:value-of select='1'/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select='0'/>
                </xsl:otherwise>
                </xsl:choose>               
            </xsl:variable>

            <Header>
            </Header>
            <LineDetail>
                <!--Here I Need to read the value of variable $varPOFlag -->
                <xsl:choose>
                <xsl:when test="$varPOFlag=0">
                    <xsl:value-of select="'Number'"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="'Description'"/>
                </xsl:otherwise>
                </xsl:choose>
            </LineDetail>
        </Invoice>
    </xsl:template>