在运行时使用 xslt 在 xml 文档中搜索

Searching in xml document using xslt at runtime

假设我有一个这样的 WSDL 文件:

<definitions>
    <binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="GetLastTradePrice">
           <soap:operation soapAction="http://example.com/GetLastTradePrice"/>
           <input>
               <soap:body use="literal"/>
           </input>
           <output>
               <soap:body use="literal"/>
           </output>
        </operation>
    </binding>

    <service name="StockQuoteService">
        <documentation>My first service</documentation>
        <port name="StockQuotePort" binding="tns:StockQuoteBinding">
           <soap:address location="http://example.com/stockquote"/>
        </port>
    </service>
</definitions>

我的 xslt 是这样的:

<xsl:for-each select="definitions/service">
</xsl:for-each>

可以找到wsdl中的所有service。但是我想找到每个服务的绑定。我该怎么做?

例如在这种情况下,对于服务StockQuoteService,我需要找到的绑定是这个节点(删除属性中的tns之后):

<binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
            <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
            <operation name="GetLastTradePrice">
               <soap:operation soapAction="http://example.com/GetLastTradePrice"/>
               <input>
                   <soap:body use="literal"/>
               </input>
               <output>
                   <soap:body use="literal"/>
               </output>
            </operation>
        </binding>

我如何在 xslt 中执行此操作?

你可以试试这个

<xsl:template match="/definitions/service">
    <xsl:variable name="this" select="." />

    <xsl:copy-of  
        select="/definitions/binding[substring-after($this/port/@binding,':') = 
                                     concat(substring-before(@name,'Soap'),'Binding')]" />
</xsl:template>