2017-01-18 53 views
0

我有以下XML:過濾在XSLT給錯誤

<?xml version="1.0" encoding="UTF-8"?> 
<bp_list xmlns="http://example.com/2012/03/01/canonical/BusinessPartner"> 
<total_count>221</total_count> 
<bp> 
    <bp_id>82721</bp_id> 
    <bp_name>bommamv1</bp_name> 
    <last_changed_date>2017-01-17T02:52:09</last_changed_date> 
    <web_site> 
     <id>40485</id> 
     <web_site_address>www.bommamv1.com</web_site_address> 
     <type>1501</type> 
     <is_primary>false</is_primary> 
    </web_site> 
    <social_compliance_participation_id>9531</social_compliance_participation_id> 
    <social_compliance_participation_name>Not currently in Scope</social_compliance_participation_name> 
    <private_public_id>9501</private_public_id> 
    <private_public_name>Private</private_public_name> 
    <year_establishment>2016</year_establishment> 
    <contact> 
     <id>259832444716</id> 
     <first_name>abc</first_name> 
     <last_name>mv1</last_name> 
     <email> 
      <id>230631479</id> 
      <email_address>[email protected]</email_address> 
      <is_primary>true</is_primary> 
     </email> 
     <phone> 
      <id>327703187</id> 
      <phone_number>6014534677</phone_number> 
      <extension>101</extension> 
      <country_code>1</country_code> 
      <display_name>16014534677</display_name> 
      <is_primary>true</is_primary> 
      <type_id>1201</type_id> 
      <type_code>Office</type_code> 
     </phone> 
     <bp_contact> 
      <is_admin_user>true</is_admin_user> 
      <is_company_officer>true</is_company_officer> 
      <shared_contact_type_id>3100</shared_contact_type_id> 
      <shared_contact_type_description>Direct Contact</shared_contact_type_description> 
      <job_title> 
       <id>1</id> 
       <name>Chief Executive Officer</name> 
      </job_title> 
     </bp_contact> 
    </contact> 
</bp> 

我想只有那些接觸中,我想「是」管理員列下,其"Is_admin"是真實的,在這樣的條件。如果"Is_admin"是錯誤的,我不希望名稱在輸出中。我試着在氧氣編輯如下:

<?xml version="1.0" encoding="utf-8"?> 
<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|admin_user|job_title|email_address|phone_number_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="ns:email[ns:is_primary = 'true']/ancestor-or-self::ns:contact/ns:last_name"/>|<xsl:value-of select="ns:email[ns:is_primary = 'true']/ancestor-or-self::ns:contact/ns:first_name"/>|<xsl:for-each select="ns:bp_contact/ns:is_admin_user='true'"><xsl:text>Yes</xsl:text></xsl:for-each>| 
      <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: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> 
      <xsl:text>&#10;</xsl:text></xsl:for-each> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

我想處理像下面的上述要求(以防萬一上面的代碼混淆閱讀):

<xsl:for-each select="ns:bp_contact/ns:is_admin_user='true'"> 
    <xsl:text>Yes</xsl:text> 
</xsl:for-each>| 

我得到一個錯誤說

值不設置

請●一個節點我知道這裏有什麼問題,我該如何處理這種情況。

我試圖在代碼中添加模板:

<xsl:template match="ns:bp/ns:contact/ns:bp_contact[ns:is_admin_user = 'true']"><xsl:copy-of select="."/></xsl:template> 

,但沒有奏效。數據根本不是文件串。

+0

請添加一個xslt-1.0標籤來指示您正在使用的xslt版本。另外,您的源XML沒有名稱空間前綴'ns',但您可以在XPath表達式中指定它。例如在第一個for-each循環中:'',源XML中沒有名爲'ns'的名稱空間,並且沒有名爲'bp_list'的元素。因此'for-each'循環不會執行。此外,''的'select'屬性應該是一個節點集,而'select =「ns:bp_contact/ns:is_admin_user ='true'」'是一個布爾表達式。 – Madeyedexter

回答

0

你可以得到所有is_admin_user = truecontact s的以下XPath表達式:

/contact[bp_contact/is_admin_user='true'] 

的XSLT所有contact節點複製與admin屬性應該是這樣的:

<xsl:template match="/contact[bp_contact/is_admin_user='true']"> 
    <xsl:copy-of select="."/> 
</xsl:template> 

看看你的XML我還沒有發現任何證據表明你需要在任何查詢上應用一個命名空間。

+1

在匹配模式開始時,A' //是多餘的。 –