【问题标题】:XML to XSL mapping - how to check the length of the element code's value - string(length)XML 到 XSL 的映射 - 如何检查元素代码值的长度 - string(length)
【发布时间】:2014-11-21 06:57:03
【问题描述】:

首先我使用的 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 文件所示,&lt;element code="CODE"&gt; 有两个值 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 页面时,页面上仅显示元素 code=CODE 的值为“00228298150-004”的数据。

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

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

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

有人知道我该怎么做吗?谢谢!!

【问题讨论】:

  • 我不明白你的问题。您为什么不将示例最小化为仅演示问题所必需的内容? -- 回答标题中的问题:使用string-length()函数。
  • 嗨@michael.hor257k 我确实把它最小化了,现在你的问题更清楚了吗?

标签: xml xslt


【解决方案1】:

我不确定您所说的“同时从 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>

(此处可能不需要使用“mode”,但我将其放在以防万一您在 XSLT 中有一个单独的模板匹配 composite)。

【讨论】:

    猜你喜欢
    • 2016-07-23
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 2015-12-29
    相关资源
    最近更新 更多