在XSLT中过滤给出错误

时间:2017-01-18 07:47:38

标签: xml xslt

我有以下XML:

<?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>abc@gmail.com</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"为false,我根本不想要输出中的名称。我在氧气编辑器中尝试了以下内容:

<?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>

但它不起作用。数据根本不是文件字符串。

1 个答案:

答案 0 :(得分:0)

您可以使用以下XPath表达式获取所有is_admin_user = true contact

/contact[bp_contact/is_admin_user='true']

使用contact属性复制所有admin节点的XSLT将如下所示:

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

查看您的XML我没有发现任何证据表明您需要在任何查询上应用命名空间。