XML到XSL的映射 - 如何检查元素代码的值的长度 - 字符串(长度)

时间:2014-11-20 20:17:05

标签: xml xslt

从我正在使用的XML文件开始,如下所示

 **<composite code="ReceivedQty">
        <element code="CODE">
            <value>**00228298150-004**</value>
        </element>
        <element code="DATE">
            <value>11-19-2014</value>
        </element>
        <element code="RECQTY">
            <value>0</value>
        </element>
        <element code="NOTES">
            <value>004A</value>
        </element>

    </composite>**
    **<composite code="ReceivedQty">
        <element code="CODE">
            <value>**00228298150**</value>
        </element>
        <element code="DATE">
            <value>11-19-2014_11-19-2014</value>
        </element>
        <element code="RECQTY">
            <value>0_0</value>
        </element>
        <element code="NOTES">
            <value>new003AAA%#$^003B</value>
        </element>
    </composite>**

如上面的XML文件所示,<element code="CODE">有两个值0022829815000228298150-004

相应的XSL文件代码是

        <xsl:for-each select="//table[@section='detail']/loop">
                <xsl:variable name="ndcNumber">
                    <xsl:value-of select="segment/element[@name='Product/Service ID']/value"/>
                </xsl:variable>
                <xsl:variable name="lineNumber">
                    <xsl:value-of select="segment/element[@name='Assigned Identification']/value"/>
                </xsl:variable>
                <xsl:variable name="ndcLineNumber">
                    <xsl:value-of select="concat($ndcNumber,'-',$lineNumber)"/>
                </xsl:variable>
                <xsl:variable name="receivedQty">
                    <xsl:value-of select="/envelope/segment[@code='ACK']/composite[@code='ReceivedQty' and element[@code='CODE' and value=$**ndcLineNumber**]]/element[@code='RECQTY']/value"/>
                </xsl:variable>
    </<xsl:for-each>

在XSL文件中,当定义变量“receivedOty”时,使用xsl选择值将其定义为ndcLinenumber(15位数)。因此,当呈现HTML页面时,页面上仅显示具有值“00228298150-004”的元素代码= CODE的数据。

我想在XSL文件中添加代码,因此元素代码= CODE的数据值为“00228298150”也会显示在HTML页面上。 $ndcnumber是(11个字符)和$ndclinenumber(15个字符)

基本上,现在我只能访问和检索ndcnumberndclinenumber中的一个值。我希望我的XSL同时从XML中检索这两个值。

也许在if else块中处理它。我想我可以找出元素代码值的长度,这样我可以检查长度(值)&gt; 11位数然后使用变量ndclinenumber,否则使用ndcnumber。

任何人都知道我怎么能这样做?谢谢!

1 个答案:

答案 0 :(得分:0)

我不确定“同时从XML中检索两个值”是什么意思,但考虑使用密钥按代码值查找composite元素。

<xsl:key name="comp" 
         match="segment[@code='ACK']/composite[@code='ReceivedQty']" 
         use="element[@code='CODE']/value" />

然后您当前的xsl:value-of可以简化为此

<xsl:value-of select="key('comp', $ndcLineNumber)/element[@code='RECQTY']/value"/>

当然,您可以添加第二个xsl:value-of来获取其他值

<xsl:value-of select="key('comp', $ndcNumber)/element[@code='RECQTY']/value"/>

但请考虑在这里使用一些模板匹配。您可以像这样添加xsl:apply-templates

<xsl:apply-templates select="key('comp', $ndcLineNumber)|key('comp', $ndcNumber)" mode="test"/>

然后模板匹配就像这样:

<xsl:template match="composite" mode="test">
   <xsl:value-of select="element[@code='RECQTY']/value" />,
</xsl:template>

(这里可能不需要使用“模式”,但我把它放在以防万一你在XSLT中有一个匹配composite的单独模板。)