使用 XSLT 1.0 进行条件检查
Conditional check using XSLT 1.0
我正在尝试检查来自 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()='YMmpuFieldResponse']/*[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>
你正在检查值(我认为值不包含元素的名称),我认为你需要检查是否有名为 item 的元素。
试试这个 <xsl:when test="name(./*)=='item'">
我现在没有工作空间来测试它,抱歉
希望对您有所帮助
您的 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
这是一种可能的方法来测试 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>
我正在尝试检查来自 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()='YMmpuFieldResponse']/*[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>
你正在检查值(我认为值不包含元素的名称),我认为你需要检查是否有名为 item 的元素。
试试这个 <xsl:when test="name(./*)=='item'">
我现在没有工作空间来测试它,抱歉
希望对您有所帮助
您的 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
这是一种可能的方法来测试 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>