使用XSLT 1.0进行条件检查

时间:2015-12-04 22:06:44

标签: xslt conditional

我正在尝试检查来自SAP后端的响应是否包含项目?

对项目的回复

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
   <soap-env:Header/>
   <soap-env:Body>
      <n0:YMmpuFieldResponse xmlns:n0="urn:sap-com:document:sap:soap:functions:mc-style">
         <EField>
            <item>
               <Yywerks>1091</Yywerks>
            </item>
         </EField>
         <EReturn/>
      </n0:YMmpuFieldResponse>
   </soap-env:Body>
</soap-env:Envelope>

没有项目的响应

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
   <soap-env:Header/>
   <soap-env:Body>
      <n0:YMmpuFieldResponse xmlns:n0="urn:sap-com:document:sap:soap:functions:mc-style">
         <EField/>
         <EReturn/>
      </n0:YMmpuFieldResponse>
   </soap-env:Body>
</soap-env:Envelope>

代码

 <xsl:stylesheet xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:dp="http://www.datapower.com/extensions" xmlns:dpquery="http://www.datapower.com/param/query" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:n0="urn:sap-com:document:sap:soap:functions:mc-style" version="1.0" extension-element-prefixes="dp" exclude-result-prefixes="soap-env dp dpquery n0">
    <xsl:template match="/">
        <xsl:choose>
<xsl:when test="not(contains(.,'item'))">
                <json:object xsi:schemaLocation="http://www.datapower.com/schemas/json jsonx.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
                    <json:string name="SAP Message">No Response from SAP. Please contact ABAP or Basis resource</json:string>
                </json:object>
            </xsl:when>
            <xsl:otherwise>
<json:array xsi:schemaLocation="http://www.datapower.com/schemas/json jsonx.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
                    <xsl:for-each select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='YMmpuFieldResponse']/*[local-name()='EField']/*[local-name()='item']">
                        <!--<json:array>-->
                        <json:object>
                            <json:string name="fieldNumber">
                                <xsl:value-of select="./Yymfldnum"/>
                            </json:string>
                        </json:object>
                    </xsl:for-each>
                </json:array>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

这是我使用的条件:

<xsl:when test="not(contains(.,'item'))">

在XSLT中测试时,它为两个响应提供相同的输出。

任何人都可以告诉我,我做错了吗?

代码:

更新我也测试了这个

<xsl:when test="name(/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='Y‌​MmpuFieldResponse']/*[local-name()='EField'])!='item'">

我仍然得到同样的回应

<?xml version="1.0" encoding="UTF-8"?>
<json:object xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx" xsi:schemaLocation="http://www.datapower.com/schemas/json jsonx.xsd">
    <json:string name="SAP Message">No Response from SAP. Please contact ABAP or Basis resource</json:string>
</json:object>

3 个答案:

答案 0 :(得分:1)

这是测试当前上下文元素中是否缺少item元素的一种可能方法:

<xsl:when test="not(.//*[local-name()='item'])">

或者更好的是,声明一个前缀以指向默认的名称空间URI,并使用该前缀而不是在整个XSL代码中使用local-name()

<xsl:stylesheet xmlns:d="default_namespace_uri_here"
    .....>

    .....
    <xsl:when test="not(.//d:item)">
    .....
</xsl:stylesheet>

答案 1 :(得分:0)

你正在检查值(我认为值不包含元素的名称),我想你需要检查是否有名为item的元素。

试试这个<xsl:when test="name(./*)=='item'">

我现在没有工作区来测试它,抱歉

希望有所帮助

答案 2 :(得分:0)

您的xpath不正确。你想要:

<xsl:when test="/soap-env:Envelope/soap-env:Body/n0:YMmpuFieldResponse/EField/item">
    <json:object xsi:schemaLocation="http://www.datapower.com/schemas/json jsonx.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
        <json:string name="SAP Message">No Response from SAP. Please contact ABAP or Basis resource</json:string>
    </json:object>
</xsl:when>

.选择当前上下文节点,例如current(),在您当前的xslt中,它是根元素soap-env:Envelope