我是XSL的新手,我需要一些帮助我的XSL,我已经请求我需要将命名空间SPR中定义的字符串替换为不同的字符串但是为了某些原因我的XSL不起作用,可能会有一些帮助我出错了。
XML:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://xyz.com/xsd">
<soapenv:Header>
<xsd:myHeader>
<!--Optional:-->
<APP_ID>APP_ID</APP_ID>
</xsd:myHeader>
</soapenv:Header>
<soapenv:Body>
<tns:SPR xmlns:tns="http://xyz.com/xsd">
<Info>
<System>
<id>id</id>
<sourceSystemName>sourceSystemName</sourceSystemName>
</System>
<Type>transmissionType</Type>
<Id>encounterId</Id>
</Info>
</tns:SPR>
</soapenv:Body>
</soapenv:Envelope>
XSL:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="/Header/Body/SubmitPreClaimRequest/*[namespace-uri(.)='']">
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="/Header/Body/SPR" />
<xsl:with-param name="replace" select="SPR" />
<xsl:with-param name="by" select="ONE" />
</xsl:call-template>
</xsl:for-each>
<xsl:apply-templates />
</xsl:template>
<xsl:template name="string-replace-all">
<xsl:param name="text" />
<xsl:param name="replace" />
<xsl:param name="by" />
<xsl:choose>
<xsl:when test="contains($text,$replace)">
<xsl:value-of select="substring-before($text,$replace)" />
<xsl:value-of select="$by" />
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="substring-after($text,$replace)" />
<xsl:with-param name="replace" select="$replace" />
<xsl:with-param name="by" select="$by" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Result with my XSL:
<?xml version="1.0" encoding="UTF-16"?>APP_IDidsourceSystemNametransmissionTypeencounterId
EXPECTED Result:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://xyz.com/xsd">
<soapenv:Header>
<xsd:myHeader>
<!--Optional:-->
<APP_ID>APP_ID</APP_ID>
</xsd:myHeader>
</soapenv:Header>
<soapenv:Body>
**<tns:ONE xmlns:tns="http://xyz.com/xsd">**
<Info>
<System>
<id>id</id>
<sourceSystemName>sourceSystemName</sourceSystemName>
</System>
<Type>transmissionType</Type>
<Id>encounterId</Id>
</Info>
**</tns:ONE>**
</soapenv:Body>
</soapenv:Envelop
答案 0 :(得分:0)
注意:
答案 1 :(得分:0)
这个简短易行的完全转型(覆盖身份规则):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/"
xmlns:tns="http://xyz.com/xsd">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="tns:SPR">
<tns:ONE>
<xsl:apply-templates/>
</tns:ONE>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档:
<soapenv:Envelope xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://xyz.com/xsd">
<soapenv:Header>
<xsd:myHeader>
<!--Optional:-->
<APP_ID>APP_ID</APP_ID>
</xsd:myHeader>
</soapenv:Header>
<soapenv:Body>
<tns:SPR xmlns:tns="http://xyz.com/xsd">
<Info>
<System>
<id>id</id>
<sourceSystemName>sourceSystemName</sourceSystemName>
</System>
<Type>transmissionType</Type>
<Id>encounterId</Id>
</Info>
</tns:SPR>
</soapenv:Body>
</soapenv:Envelope>
生成想要的正确结果:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://xyz.com/xsd">
<soapenv:Header>
<xsd:myHeader><!--Optional:-->
<APP_ID>APP_ID</APP_ID>
</xsd:myHeader>
</soapenv:Header>
<soapenv:Body>
<tns:ONE xmlns:tns="http://xyz.com/xsd">
<Info>
<System>
<id>id</id>
<sourceSystemName>sourceSystemName</sourceSystemName>
</System>
<Type>transmissionType</Type>
<Id>encounterId</Id>
</Info>
</tns:ONE>
</soapenv:Body>
</soapenv:Envelope>
<强>解释强>:
identity rule /模板按“原样”复制每个节点。
只有一个模板会覆盖身份规则 - 匹配任何tns:SPR
元素。
在此重写模板中,输出名为tns:ONE
的新文字结果元素 - 在其正文中处理其所有子节点(通过标识模板,导致“按原样”复制它们。
记住:使用和覆盖标识规则是最基本和最强大的XSLT设计模式 - 最适合任何需要“按原样”复制大多数节点的任务,并且仅用于处理不同的是一些特定的节点 - 重命名/删除/插入,......等等。