如何使用XQuery基于分隔符拆分字符串

时间:2013-02-19 10:25:20

标签: xml string split xquery

我从sql:

返回了这个xml
<Keywords>
  <Record CIMtrek_Keywords="Bus Dev|Ser Del|Sol Del|?" />
</Keywords>

我希望在组合框中逐个放置这些值,示例代码低于其中Increase and Decrease的值与我希望逐个Bus Dev and Ser Del and Sol Del and ?的值相同

<select size="1" style="width:60%;" name="CIMtrek_CI_CER_Type"
                                                id="CIMtrek_CI_CER_Type">
                                                <option value="0">Select Fund Type</option>
                                                <option value="Increase">
                                                    <xsl:if test="//Record/CIMtrek_CI_CER_Type/text()='Increase'">
                                                        <xsl:attribute name="selected">true</xsl:attribute>
                                                    </xsl:if>
                                                    Increase
                                                </option>
                                                <option value="Decrease">
                                                    <xsl:if
                                                        test="//Record/CIMtrek_CI_CER_Type/text()='Decrease'">
                                                        <xsl:attribute name="selected">true</xsl:attribute>
                                                    </xsl:if>
                                                    Decrease
                                                </option>
                                            </select>

这就是我根据SQL查询生成的xml中的值创建组合框的方法:

<xsl:for-each select="//CIMtrek_CarrierName/Record">
                                                    <option>
                                                        <xsl:if
                                                            test="//Record/CIMtrek_RegWhseCo_Carrier/text()=@CIMtrek_CarrierName">
                                                            <xsl:attribute name="selected">true</xsl:attribute>
                                                        </xsl:if>
                                                        <xsl:attribute name="value"><xsl:value-of
                                                            select="@CIMtrek_CarrierName" />!@#$%^*!<xsl:value-of
                                                            select="@Carrier_LateContacts" />!@#$%^*!<xsl:value-of
                                                            select="@Carrier_Contacts1" />!@#$%^*!<xsl:value-of
                                                            select="@Carrier_Contacts2" />!@#$%^*!<xsl:value-of
                                                            select="@Carrier_Contacts3" /></xsl:attribute>
                                                        <xsl:value-of select="@CIMtrek_CarrierName" />
                                                    </option>
                                                </xsl:for-each>

与BeniBela的回答我无法把东西放进去,就像上面的代码一样,

希望BeniBela可以帮助我解决这个问题。

如何做到这一点,

请帮助我,

最诚挚的问候。

1 个答案:

答案 0 :(得分:2)

tokenize()函数就是这样做的。请注意,它采用正则表达式,因此必须将|转义为[|],导致:

for $o in /Keywords/Record/tokenize(@CIMtrek_Keywords, "[|]") return
  <option value="{$o}">{$o}</option>

可以将新的xml转换为xquery,如下所示:

for $r in //CIMtrek_CarrierName/Record return  $r/
  <option value="{@CIMtrek_CarrierName}!@#$%^*!{@Carrier_LateContacts}!@#$%^*!{@Carrier_Contacts1}!@#$%^*!{@Carrier_Contacts2}!@#$%^*!{@Carrier_Contacts3}">
  {  if (//Record/CIMtrek_RegWhseCo_Carrier/text()=@CIMtrek_CarrierName) then attribute selected { "true" } else (),
     data(@CIMtrek_CarrierName)  }
  </option>

初始的$ r /更改了上下文,因此我们不需要在每个属性访问之前写入$ r /,xsl:value-of变为{..}并且xsl:attribute变为类似xml的属性声明或者'属性名称{..}'