我有一个带有电话号码的大型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> </xsl:text></xsl:for-each>
</xsl:for-each></xsl:template>
</xsl:stylesheet>
答案 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>