Beispiele für XSLT -Richtlinien
Beispiele für die OpenAPI -Definitionen von XSLT -Richtlinien
- Einfaches Beispiel ohne aktuelle Kontextnutzdaten
- Verkettung und Konvertierung
- Abfrageparameter abrufen und auf Kontextvariablen verweisen
- DataPower -Objektname zurückgeben, der einem TLS-Clientprofil zugeordnet ist
Achtung:
- Die hier beschriebenen Mechanismen für die Interaktion mit dem API Connect-Kontext sind für v5-compatible-Gateways gedacht und sollen auch v5-Kompatibilität für APIs bieten, die für das API Gateway erstellt wurden. Das v5-compatible Gateway ist in API Connect Enterprise as a Service nicht verfügbar, Daher müssen Sie die in Verwendung von Kontextvariablen in GatewayScript beschriebenen Mechanismen und XSLT-Richtlinien mit dem DataPower API Gateway verwenden. Für API Gateway -APIs dürfen die hier aufgeführten v5-compatibility nur für die Migration von v5 verwendet werden.
- Die XML-Spezifikation https://www.w3.org/TR/xml/ gibt keine bevorzugte Reihenfolge für XML-Namensbereichsattribute (XMLNS) an. Das bewährte Verfahren besteht darin, sich beim Schreiben von angepasstem Parsingcode nicht auf die Reihenfolge der XMLNS-Attribute zu verlassen.
Einfaches Beispiel ohne aktuelle Kontextnutzdaten
Beim Folgenden handelt es sich um ein Beispiel, in dem das XSLT-Eingabedokument die aktuellen Kontextnutzdaten nicht
verwendet (es erfolgt keine Eingabe):
- xslt:
title: example xslt
source: |
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<Hello>World!</Hello>
</xsl:template>
</xsl:stylesheet>Verkettung und Konvertierung
Im folgenden Beispiel wird eine komplexere XSLT-Umwandlungsquelle dargestellt; hier verkettet das Style-Sheet zwei
Eingabezeichenfolgen und wandelt die dritte Eingabezeichenfolge in die IP-Adresse des Clients um:
- xslt:
title: xslt
input: true
source: |
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xslt"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:dp="http://www.datapower.com/extensions"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs4xs="http://www.w3.org/2001/XMLSchema"
xmlns:io="http://xformMessage"
xmlns:map="http://xformMessage/xform"
xmlns:msl="http://www.ibm.com/xmlmap"
exclude-result-prefixes="fn dp dp map xalan msl"
version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="no"/>
<!-- root wrapper template -->
<xsl:template match="/">
<msl:datamap>
<xsl:choose>
<xsl:when test="not(msl:datamap/dataObject[1]/@xsi:nil)">
<xsl:element name="dataObject">
<xsl:attribute name="xsi:type">
<xsl:value-of select="'io:data'"/>
</xsl:attribute>
<xsl:call-template name="map:xform">
<xsl:with-param name="data" select="msl:datamap/dataObject[1]"/>
</xsl:call-template>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="dataObject">
<xsl:attribute name="xsi:type">
<xsl:value-of select="'io:data'"/>
</xsl:attribute>
<xsl:attribute name="xsi:nil">
<xsl:text>true</xsl:text>
</xsl:attribute>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</msl:datamap>
</xsl:template>
<!-- This rule represents a type mapping: "data" to "io:data". -->
<xsl:template name="map:xform">
<xsl:param name="data"/>
<!-- a simple data mapping: "$data/StringOne"(string) to "StringOne"(string) -->
<xsl:if test="$data/StringOne">
<StringOne>
<xsl:value-of select="concat($data/StringOne, $data/StringTwo)"/>
</StringOne>
</xsl:if>
<!-- a simple mapping with no associated source: to "StringTwo"(string) -->
<StringTwo>
<xsl:value-of select="dp:client-ip-addr()"/>
</StringTwo>
<!-- a simple data mapping: "$data/NumberOne"(int) to "NumberOne"(int) -->
<xsl:if test="$data/NumberOne">
<NumberOne>
<xsl:value-of select="$data/NumberOne"/>
</NumberOne>
</xsl:if>
<!-- a simple data mapping: "$data/NumberTwo"(int) to "NumberTwo"(int) -->
<xsl:if test="$data/NumberTwo">
<NumberTwo>
<xsl:value-of select="$data/NumberTwo"/>
</NumberTwo>
</xsl:if>
<!-- a simple data mapping: "$data/NumberThree"(int) to "NumberThree"(int) -->
<xsl:if test="$data/NumberThree">
<NumberThree>
<xsl:value-of select="$data/NumberThree"/>
</NumberThree>
</xsl:if>
</xsl:template>
<!-- ***************** Utility Templates ****************** -->
<!-- copy the namespace declarations from the source to the target -->
<xsl:template name="copyNamespaceDeclarations">
<xsl:param name="root"/>
<xsl:for-each select="$root/namespace::*[not(name() = '')]">
<xsl:copy/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Abfrageparameter abrufen und auf Kontextvariablen verweisen
Das folgende Beispiel zeigt eine vollständige OpenAPI -Quellendatei. Die API enthält eine XSLT -Richtlinie, die einen Abfrageparameterwert in XSLT abruft und außerdem die Methode
getvariable verwendet, um den Wert der Kontextvariablen request.headers.user-agentabzurufen.swagger: '2.0'
info:
x-ibm-name: xslt
title: xslt
version: 1.0.0
schemes:
- https
host: $(catalog.host)
basePath: /xslt
consumes:
- application/json
produces:
- application/json
securityDefinitions:
clientIdHeader:
type: apiKey
in: header
name: X-IBM-Client-Id
security:
- clientIdHeader: []
x-ibm-configuration:
testable: true
enforced: true
cors:
enabled: true
assembly:
execute:
- operation-switch:
title: operation-switch
case:
- operations:
- verb: get
path: /hello
execute:
- xslt:
title: SayHello
input: false
source: |
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:element name="APIc">
<xsl:text>Hello World!</xsl:text>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
- operations:
- verb: get
path: /getContextQueryVar
execute:
- xslt:
title: GetContextQueryVar
input: false
source: |
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:apim="http://www.ibm.com/apimanagement">
<xsl:import href="local:/isp/policy/apim.custom.xsl"/>
<xsl:template match="/">
<xsl:call-template name="apim:output">
<xsl:with-param name="mediaType" select="'application/xml'"/>
</xsl:call-template>
<APIC>
<xsl:element name="apim.getVariable">
<xsl:element name="useragent">
<xsl:value-of select="apim:getVariable('request.headers.user-agent')"/>
</xsl:element>
<xsl:element name="query">
<xsl:value-of select="apim:getVariable('request.querystring')"/>
</xsl:element>
</xsl:element>
</APIC>
</xsl:template>
</xsl:stylesheet>
- operations:
- verb: get
path: /getQuery
execute: []
otherwise:
- throw: null
title: handling unknown operation
name: Unsupported
catch:
- errors:
- Unsupported
execute:
- set-variable:
actions:
- set: message.body
value: '<error>Not Supported</error>'
phase: realized
paths:
/hello:
get:
responses:
'200':
description: 200 OK
/getContextQueryVar:
get:
responses:
'200':
description: 200 OK
definitions: {}
tags: []Gibt den DataPower -Objektnamen zurück, der einem TLS-Clientprofil zugeordnet ist.
Im folgenden Beispiel wird mit der Funktion
apim:getTLSProfileObjName der DataPower -Objektname zurückgegeben, der einem angegebenen TLS-Clientprofil zugeordnet ist.- xslt:
title: xslt
input: false
version: 2.0.0
source: >-
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dp="http://www.datapower.com/extensions"
xmlns:apim="http://www.ibm.com/apimanagement"
exclude-result-prefixes="dp apim"
extension-element-prefixes="dp"
version="1.0">
<!-- For apigw ... store:///dp/apim.custom.xsl -->
<!-- For v5/v5c ... local:///isp/policy/apim.custom.xsl -->
<!-- <xsl:import href="local:///isp/policy/apim.custom.xsl"/> -->
<xsl:import href="store:///dp/apim.custom.xsl"/>
<xsl:template match="/">
<xsl:variable name="httpHeaders">
<header name="Accept">application/xml</header>
</xsl:variable>
<!--
For v5, the name returned is client:<orgname>-my-test
For v5c, the name returned is client:<orgname>-my-testV1.0.0
For API Gateway, the name returned is client:<orgname>_<catalogname>_tlsp-my-testV1.0.0
-->
<xsl:variable name="tlsClientProfile" select="apim:getTLSProfileObjName('my-test')" />
<xsl:variable name="targetUrl" select="'https://127.0.0.1:6201/PingRequest'"/>
<dp:url-open target="{$targetUrl}" response="responsecode" timeout="20" http-headers="$httpHeaders" ssl-proxy="{$tlsClientProfile}"/>
</xsl:template>
</xsl:stylesheet>Beachten Sie, dass Verweise auf das "v5c"-Gateway (v5-compatible) nicht für API Connect Enterprise as a Service gelten.
Weitere Beispiele für die Verwendung von XSLT für den Zugriff auf und die Änderung von Eigenschaften und Kontext finden Sie unter Beispiele für Implementierungscodes und bei Verwendung von DataPower® API Gatewayunter Kontextvariablen in GatewayScript und XSLT-Richtlinien mit dem DataPower API Gateway.