如何在XSLT中使用符号(;)分隔类似的数据元素

时间:2018-06-19 10:20:22

标签: xslt xslt-2.0 xslt-grouping xslt-3.0

我的源代码如下。我有类似的数据元素具有不同的值。下面的示例我有3个电话号码,我希望所有单线都有一个分隔符(;)我使用了连接函数但没有用

<?xml version="1.0" encoding="UTF-8"?>
<report_entry>
<report_data>
    <Phone_Numbers_-_Home Descriptor="+44 (233) 45666">
        <ID type="WID">16001e91f6ba1ewa583d2eafc901baa6</ID>
    </Phone_Numbers_-_Home>
    <Phone_Numbers_-_Home Descriptor="+44 (234) 56777">
        <ID type="WID">16001ewsf6ba108a584e5d776077bbe3</ID>
    </Phone_Numbers_-_Home>
    <Phone_Numbers_-_Home Descriptor="+44 (123) 23450987">
        <ID type="WID">16001e91f6ba1b8a582ab3e49446b92c</ID>
    </Phone_Numbers_-_Home>
</report_data>

预期结果如下。我需要 ”;”在黑白数据值

+44 (233) 45666 +44;(234) 56777;+44 (123) 23450987

我正在使用下面的代码,其中符号(;)位于字符串末尾,不需要。我需要用黑白手机上的电话值,而不需要在最后一个值的末尾

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"  
xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
exclude-result-prefixes="xs xd"
version="2.0">
<xsl:output method="text" omit-xml-declaration="yes"></xsl:output>

<xsl:template match="/report_entry/report_data">      

    <xsl:value-of select="Phone_Numbers_-_Home/@Descriptor"/> <xsl:value-of select="';'"/>


</xsl:template>

3 个答案:

答案 0 :(得分:2)

通过查看规范https://www.w3.org/TR/xslt-30/#element-value-of,您可以轻松找到xsl:value-of select="Phone_Numbers_-_Home/@Descriptor"选择的分隔项目的方法,因为您找到了名为{{1}的属性所以你需要separator

答案 1 :(得分:0)

<xsl:template match="//Phone_Numbers_-_Home">
        <xsl:value-of select="@Descriptor"/>
        <xsl:if test="not(position()= last())">
            <xsl:text>;</xsl:text>
        </xsl:if>
   </xsl:template>

检查此答案

答案 2 :(得分:0)

要实现您的期望输出,我们可以采用多种方式来完成操作,例如concat(),string-join()以及建议的@Martin使用@separator:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"  
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
    exclude-result-prefixes="xs xd"
    version="2.0">

    <xsl:output method="text" omit-xml-declaration="yes"/>

    <xsl:template match="/report_entry/report_data">
      <!--  <xsl:value-of select="Phone_Numbers_-_Home/@Descriptor" separator="; "/>-->
        <xsl:value-of select="string-join(Phone_Numbers_-_Home/@Descriptor, '; ')"/>
    </xsl:template>

</xsl:stylesheet>