在 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
那么它们将可以在 LineDetail
和 Header
:
内部访问
<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>
我在将变量值从 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
那么它们将可以在 LineDetail
和 Header
:
<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>