2017-01-16 50 views
0

我有一個包含電話號碼的大XML。XSLT:選擇沒有給出結果的語句

<contact> 
     <id>239763415</id> 
     <first_name>abc</first_name> 
     <last_name>bbb</last_name> 
     <email> 
      <id>230417772952</id> 
      <email_address>[email protected]</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的一部分。要求是,如果「is_primary」爲真,那麼電話號碼應該進來別的COLUMN1如果「is_primary」是假的,那麼它應該在第2列

[email protected],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

我假設你想要的電話號碼來與標題「PHONE_NUMBER_1」和「PHONE_NUMBER_2」欄下。目前,用於獲取電話號碼的代碼將它們放在行的末尾,位於「responsibility」之後。

這裏你不需要xsl:choose。你可以在條件xsl:value-of聲明本身

<xsl:value-of select="ns:phone[ns:is_primary = 'true']/ns:phone_number" /> 

請注意在這裏使用撇號。如果您確實只是ns:is_primary = true它要尋找在XML被稱爲「真」的元素,而不僅僅是值「真」

我也建議你使用<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>