在XSLT中解析字符串

时间:2014-06-06 16:28:52

标签: xml xslt xpath substring

我正在XSLT中进行for-each循环,并且它返回一个长字符串。我想要做的是解析字符串。

这是代码。

<xsl:for-each select="/CAudioFile/CRI/PrivateData/PrivateData/DictionaryEntry">
    <xsl:value-of select="Value" />
</xsl:for-each>

这是它返回的字符串:

9702195481, 31201(CCC AGENT)09999051221399561274822396000069522

我想要做的是将第一部分放在一个变量中:

9702195481, 31201(CCC AGENT)

并用分号替换逗号。

第二个字符串从第一个字符串的末尾开始,它是20个字符。所以它会返回

09999051221399561274

我试过substring,但是我遇到了编译错误。

关于如何实现这一目标的任何建议?

这是源xml和xslt文件。

XML and XSLT File

这里'屏幕截图显示了它现在的样子和我想要的格式。

The format I want Image

我实际上更喜欢这个来生成CSV,但是我的格式不正确就是为什么我坚持使用HTML。

2 个答案:

答案 0 :(得分:2)

如果您不希望以一个长字符串连接所有DictionaryEntry / Values,那么请不要这样做:

<td>
    <xsl:for-each select="CAudioFile/CRI/PrivateData/PrivateData/DictionaryEntry">
        <xsl:value-of select="Value" />
    </xsl:for-each>
</td>

尝试改为:

<td>
    <xsl:value-of select="translate(CAudioFile/CRI/PrivateData/PrivateData/DictionaryEntry[1]/Value, ',', ';')" />
    <xsl:value-of select="CAudioFile/CRI/PrivateData/PrivateData/DictionaryEntry[2]/Value" />
</td>

或者也许:

<td>
    <xsl:value-of select="translate(CAudioFile/CRI/PrivateData/PrivateData/DictionaryEntry[Key='CD1']/Value, ',', ';')" />
    <xsl:value-of select="CAudioFile/CRI/PrivateData/PrivateData/DictionaryEntry[Key='CD2']/Value" />
</td>

答案 1 :(得分:0)

此XPath表达式将提取字符串的第一部分,如果,您可以将)视为分隔符(它不会出现在候选字符串中的任何其他位置):< / p>

concat(translate(substring-before('9702195481, 31201(CCC ...', ')'),',',';'),')')

这个将获得第二部分的前20个字符:

substring(substring-after('9702195481, 31201(CCC ...', ')'),1,20)

您可以在<xsl:value-of select="">中使用这些内容并将其放在<xsl:variable>内以将其保存在变量中:

 <xsl:for-each select="/CAudioFile/CRI/PrivateData/PrivateData/DictionaryEntry">
        <xsl:variable name="first">
            <xsl:value-of select="concat(translate(substring-before(., ')'),',',';'),')')" />
        </xsl:variable>
        <xsl:variable name="second">
            <xsl:value-of select="substring(substring-after(., ')'),1,20)" />
        </xsl:variable>

        <first-part><xsl:value-of select="$first" /></first-part>
        <second-part><xsl:value-of select="$second" /></second-part>
 </xsl:for-each>

假设您提供的示例字符串

9702195481, 31201(CCC AGENT)09999051221399561274822396000069522

for-each中的上下文节点的值(对于某个迭代),它将打印出来:

<first-part>9702195481; 31201(CCC AGENT)</first-part>
<second-part>09999051221399561274</second-part>

您可以在 xslt fiddle

中验证此转化