XSLT1.0 :: 我想在 XML 中添加一个新元素,其后缀和名称空间作为其父元素
XSLT1.0 :: I want to add a new element in XML with suffix and namespace as its parent
仅在 XSLT1.0 中需要解决方案。我想创建一个 xslt,它可以在固定位置添加一个元素,而不考虑命名空间。我想添加 sas_api_key 元素,如 XMLs
的输出所示
XML1 的输入:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body xmlns:get="http://tempuri.org/getScreeningProfile">
<get:getScreeningProfile>
<get:parameters>
<get:party_number>334857</get:party_number>
</get:parameters>
</get:getScreeningProfile>
</soap:Body>
</soap:Envelope>
XML1 的输出:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body xmlns:get="http://tempuri.org/getScreeningProfile">
<get:getScreeningProfile>
<get:parameters>
<get:sas_api_key>123<get:sas_api_key>
<get:party_number>334857</get:party_number>
</get:parameters>
</get:getScreeningProfile>
</soap:Body>
</soap:Envelope>
XML2 的输入:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:biw="http://www.sas.com/xml/namespace/biwebservices">
<soapenv:Header/>
<soapenv:Body>
<biw:getScreeningProfile_v2>
<biw:parameters>
<biw:sas_api_key>123<biw:sas_api_key>
<biw:party_number>12345</biw:party_number>
</biw:parameters>
</biw:getScreeningProfile_v2>
</soapenv:Body>
</soapenv:Envelope>
XML2 的输出:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:biw="http://www.sas.com/xml/namespace/biwebservices">
<soapenv:Header/>
<soapenv:Body>
<biw:getScreeningProfile_v2>
<biw:parameters>
<biw:sas_api_key>123<biw:sas_api_key>
<biw:party_number>12345</biw:party_number>
</biw:parameters>
</biw:getScreeningProfile_v2>
</soapenv:Body>
</soapenv:Envelope>
下面是我创建的 XSLT,但它没有按预期工作。请协助。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="//*[local-name()='parameters']/*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//*[local-name()='parameters']/*">
<xsl:element name="sas_api_key" inherit-namespaces="yes">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
在 XSLT 1.0 中,您可以:
<xsl:template match="*[local-name()='parameters']">
<xsl:copy>
<xsl:element name="{substring-before(name(), ':')}:sas_api_key" namespace="{namespace-uri()}">123</xsl:element>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
请注意,这假设 parameters
元素确实有一个前缀。
如果您有 parameters
元素可以使用的允许前缀和命名空间的列表,最好使用它,而不是依赖它是唯一具有此本地名称的元素。毕竟,使用名称空间的真正目的是区分具有相同本地名称的元素。
仅在 XSLT1.0 中需要解决方案。我想创建一个 xslt,它可以在固定位置添加一个元素,而不考虑命名空间。我想添加 sas_api_key 元素,如 XMLs
的输出所示XML1 的输入:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body xmlns:get="http://tempuri.org/getScreeningProfile">
<get:getScreeningProfile>
<get:parameters>
<get:party_number>334857</get:party_number>
</get:parameters>
</get:getScreeningProfile>
</soap:Body>
</soap:Envelope>
XML1 的输出:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body xmlns:get="http://tempuri.org/getScreeningProfile">
<get:getScreeningProfile>
<get:parameters>
<get:sas_api_key>123<get:sas_api_key>
<get:party_number>334857</get:party_number>
</get:parameters>
</get:getScreeningProfile>
</soap:Body>
</soap:Envelope>
XML2 的输入:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:biw="http://www.sas.com/xml/namespace/biwebservices">
<soapenv:Header/>
<soapenv:Body>
<biw:getScreeningProfile_v2>
<biw:parameters>
<biw:sas_api_key>123<biw:sas_api_key>
<biw:party_number>12345</biw:party_number>
</biw:parameters>
</biw:getScreeningProfile_v2>
</soapenv:Body>
</soapenv:Envelope>
XML2 的输出:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:biw="http://www.sas.com/xml/namespace/biwebservices">
<soapenv:Header/>
<soapenv:Body>
<biw:getScreeningProfile_v2>
<biw:parameters>
<biw:sas_api_key>123<biw:sas_api_key>
<biw:party_number>12345</biw:party_number>
</biw:parameters>
</biw:getScreeningProfile_v2>
</soapenv:Body>
</soapenv:Envelope>
下面是我创建的 XSLT,但它没有按预期工作。请协助。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="//*[local-name()='parameters']/*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//*[local-name()='parameters']/*">
<xsl:element name="sas_api_key" inherit-namespaces="yes">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
在 XSLT 1.0 中,您可以:
<xsl:template match="*[local-name()='parameters']">
<xsl:copy>
<xsl:element name="{substring-before(name(), ':')}:sas_api_key" namespace="{namespace-uri()}">123</xsl:element>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
请注意,这假设 parameters
元素确实有一个前缀。
如果您有 parameters
元素可以使用的允许前缀和命名空间的列表,最好使用它,而不是依赖它是唯一具有此本地名称的元素。毕竟,使用名称空间的真正目的是区分具有相同本地名称的元素。