XSLT:选择不给出结果的语句

时间:2017-01-16 17:07:08

标签: xml xslt

我有一个带有电话号码的大型XML。

<contact>
        <id>239763415</id>
        <first_name>abc</first_name>
        <last_name>bbb</last_name>
        <email>
            <id>230417772952</id>
            <email_address>some@something.com</email_address>
            <is_primary>true</is_primary>
        </email>
        <phone>
            <id>327466887779</id>
            <phone_number>7738908907</phone_number>
            <extension>8907</extension>
            <country_code>1</country_code>
            <display_name>17738908907</display_name>
            <is_primary>true</is_primary>
            <type_id>1201</type_id>
            <type_code>Office</type_code>
        </phone>
        <phone>
            <id>327466890</id>
            <phone_number>312405226463</phone_number>
            <country_code>1</country_code>
            <display_name>13124056463</display_name>
            <is_primary>false</is_primary>
            <type_id>1202</type_id>
            <type_code>Mobile</type_code>
        </phone>

这只是XML的一部分。要求是,如果&#34; is_primary&#34;如果是&#34; is_primary&#34;那么电话号码应该在第1列中。是假的,那么它应该在第2栏。

some@something.com,7738908907,312405226463

这是我尝试过的。请考虑最后一部分,因为其余代码符合其他要求。

<xsl:stylesheet version="1.0"                      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns:fo="http://www.w3.org/1999/XSL/Format" 
xmlns:ns="http://target.com/2012/03/01/canonical/BusinessPartner"> 
<xsl:strip-space elements="*" />
<xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template    match="/">bp_name|last_name|first_name|job_title|email_address|phone_numb     er_1|phone_number_2|responsibility_name
 <xsl:for-each select="ns:bp_list/ns:bp">
        <xsl:variable name="bp_name" select="ns:bp_name" />
        <xsl:for-each select="ns:contact">
            <xsl:value-of select="$bp_name"/>|<xsl:value-of select="normalize-space(ns:last_name)"/>|<xsl:value-of select="normalize-space(ns:first_name)"/>|<xsl:for-each select="(ns:bp_contact/ns:job_title)">
                <xsl:value-of select="(ns:name)"/>
                <xsl:if test="position() != last()">
                    <xsl:text>;</xsl:text>
                </xsl:if>
            </xsl:for-each>|<xsl:value-of select="normalize-space(ns:email/ns:email_address)"/>|<xsl:for-each select="(ns:bp_contact/ns:role/ns:responsibility)">
                <xsl:value-of select="(ns:responsibility_name)"/>
                <xsl:if test="position() != last()">
                    <xsl:text>;</xsl:text>
                </xsl:if>
            </xsl:for-each>               
                <xsl:choose>
                    <xsl:when test="ns:is_primary =true">
                    <xsl:value-of select="(ns:phone_number)"/> 
                    </xsl:when>
                </xsl:choose> 
                <xsl:choose>
                <xsl:when test="ns:is_primary =false">
                    <xsl:value-of select="(ns:phone_number)"/> 
                </xsl:when>
                </xsl:choose>  
            </xsl:for-each>
            <xsl:text>&#10;</xsl:text></xsl:for-each> 

    </xsl:for-each></xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

我假设您希望电话号码位于标题为“phone_number_1”和“phone_number_2”的列下。目前,获取电话号码的代码将它们放在“责任名称”之后的行尾。

此处您不需要xsl:choose。您可以在xsl:value-of语句本身

中添加条件
<xsl:value-of select="ns:phone[ns:is_primary = 'true']/ns:phone_number" />

注意这里使用撇号。如果只做了ns:is_primary = true,它会在XML中寻找一个名为“true”的元素,而不仅仅是值“true”

我还建议您更频繁地使用<xsl:text>,以使代码更容易布局。

尝试使用此XSLT代码段输出最后4列

<xsl:value-of select="normalize-space(ns:email/ns:email_address)"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="ns:phone[ns:is_primary = 'true']/ns:phone_number" />
<xsl:text>|</xsl:text>
<xsl:value-of select="ns:phone[ns:is_primary = 'false']/ns:phone_number" />
<xsl:text>|</xsl:text>
<xsl:for-each select="(ns:bp_contact/ns:role/ns:responsibility)">
    <xsl:value-of select="(ns:responsibility_name)"/>
    <xsl:if test="position() != last()">
        <xsl:text>;</xsl:text>
    </xsl:if>
</xsl:for-each>