如果标记不存在,则使用XSLT将XML标记添加到SOAP消息
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果标记不存在,则使用XSLT将XML标记添加到SOAP消息相关的知识,希望对你有一定的参考价值。
我对XSLT很陌生,并且不知道如何为我想要的转换找到解决方案。我们收到SOAP请求,需要检查是否存在某个标记(步骤)。如果不存在,我想将其添加到SOAP消息中。
我们在Azure API Management上运行接口,该接口仅允许1.0版本的XSLT。
XML示例
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ProductionToSupply xmlns="http://somenamespace.com">
<ProductionDataList>
<ProductionData>
<Material_Number>5</Material_Number>
<Doc_Number>1234</Doc_Number>
<Description>abcde</Description>
</ProductionData>
</ProductionDataList>
</ProductionToSupply>
</soap:Body>
</soap:Envelope>
XSLT
<?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:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://somenamespace.com" exclude-result-prefixes="ns1">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="soap:Envelope/soap:Body/ns1:ProductionToSupply/ns1:ProductionDataList/ns1:ProductionData/ns1:Doc_Number">
<xsl:if test="not(soap:Envelope/soap:Body/ns1:ProductionToSupply/ns1:ProductionDataList/ns1:ProductionData/ns1:Steps)">
<Steps xmlns="http://somenamespace.com">NA</Steps>
</xsl:if>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
期望的输出
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ProductionToSupply xmlns="http://somenamespace.com">
<ProductionDataList>
<ProductionData>
<Material_Number>5</Material_Number>
<Doc_Number>1234</Doc_Number>
<Description>abcde</Description>
<Steps>NA</Steps>
</ProductionData>
</ProductionDataList>
</ProductionToSupply>
</soap:Body>
</soap:Envelope>
如果组“生产数据”中不存在标记“步骤”,则预期结果将是添加标记,但我不知道如何设置适当的匹配模式。
在此先感谢您的帮助
答案
如果你想匹配组ProductionData
只有它没有Steps
元素,模板匹配将是这个
<xsl:template match="ns1:ProductionData[not(ns1:Steps)]">
然后你可以复制ProductionData
元素及其子节点,同时在Steps
元素中滑动
试试这个XSLT
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://somenamespace.com" exclude-result-prefixes="ns1">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ns1:ProductionData[not(ns1:Steps)]">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<Steps xmlns="http://somenamespace.com">NA</Steps>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这会将Steps
添加为最后一个孩子。如果您想在Doc_Number
之后立即使用它,请用此替换模板
<xsl:template match="ns1:ProductionData[not(ns1:Steps)]/ns1:Doc_Number">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
<Steps xmlns="http://somenamespace.com">NA</Steps>
</xsl:template>
以上是关于如果标记不存在,则使用XSLT将XML标记添加到SOAP消息的主要内容,如果未能解决你的问题,请参考以下文章
使用 XSLT 为 XML 到 HTML 转换中的不同 <place> 标记添加超链接