XSLT 정책 예
XSLT 정책의 OpenAPI 정의에 대한 예제입니다.
주의:
- 여기서 설명하는 API Connect 컨텍스트와의 상호작용 메커니즘은 v5-compatible 게이트웨이를 위한 것이며, 또한 API Gateway 용으로 개발된 API에 대해 v5 호환성을 제공하기 위한 것입니다. v5-compatible 게이트웨이는 Enterprise as a API Connect Service에서 사용할 수 없으므로, DataPower ( API Gateway )를 사용하여 GatewayScript 및 XSLT 정책에서 컨텍스트 변수를 사용하는 방법에 설명된 방식을 따라야 합니다. API Gateway API의 경우, 여기에 나열된 v5-compatibility 함수는 v5 로의 마이그레이션 시에만 사용해야 합니다.
- XML 사양( https://www.w3.org/TR/xml/ )은 XML 네임스페이스(XMLNS) 속성의 권장 순서를 명시하지 않습니다. 우수 사례는 사용자 정의 구문 분석 코드를 작성하는 경우 XMLNS 속성의 순서를 따르지 않는 것입니다.
컨텍스트 현재 페이로드가 없는 간단한 예
다음은 XSLT 입력 문서에서 컨텍스트 현재 페이로드를 사용하지 않는
예입니다(입력이
없음).
- 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>연결 및 변환
다음 예에서는 더 복잡한 XSLT 변환 소스를 표시합니다.
여기서는 스타일시트가 두 개의 입력 문자열을 연결하고, 세 번째 입력 문자열을 클라이언트의
IP 주소로 변환합니다.
- 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>
조회 매개변수값 얻기 및 컨텍스트 변수 참조
다음 예제는 완전한 OpenAPI 소스 파일을 표시합니다. API에는 XSLT로 된 조회 매개변수 값을 확보하고
getvariable 메소드를 사용하여 컨텍스트 변수 request.headers.user-agent의 값을 검색하는 XSLT 정책이 포함되어 있습니다.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: []클라이언트 TLS 프로필과 연결된 DataPower 객체 이름을 반환합니다
다음 예제에서는 함수를
apim:getTLSProfileObjName 사용하여 지정된 클라이언트 TLS 프로필과 연결된 DataPower 객체 이름을 반환합니다.- 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>“ v5c ”( v5-compatible ) 게이트웨이에 대한 내용은 Enterprise as a API Connect Service에는 적용되지 않는다는 점에 유의하십시오.
XSLT를 사용하여 속성과 컨텍스트에 접근하고 수정하는 방법에 대한 더 많은 예 제는 ‘구현 코드 예제’를 참조하십시오. 또한, DataPower® API Gateway ‘’을 사용하는 경우, DataPower 의 ‘ GatewayScript 및 XSLT 정책에서 컨텍스트 변수 사용’ API Gateway 을 참조하십시오.
Need more info here on what the API does, from an end-user perspective.