1

我想将每个“字符串”节点打印为来自以下 xml 的 li 项:

<soapenv:Envelope 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:soapenv="http://schemas.url.org/url/envelope/"
>
    <soapenv:Header>
        <MultiSpeakMsgHeader 
            Version="" UserID="" 
            Pwd="" AppName="xx" AppVersion="x" 
            Company="xxx" xmlns="http://www.url.org/Version_3.0"
        />
    </soapenv:Header>
    <soapenv:Body>
        <GetMethodsResponse xmlns="http://www.url.org/Version_3.0">
            <GetMethods>
                <string>GetDomainMembers</string>
                <string>GetDomainNames</string>
                <string>GetMethods</string>
                <string>pingURL</string>
                <string>GetAllMeters</string>
                <string>GetAllServiceLocations</string>
                <string>GetAllCustomers</string>
                <string>GetCustomerByCustId</string>
                <string>GetServiceLocationByAccountNo</string>
                <string>GetServiceLocationByMeterNo</string>
                <string>ReadingChangedNotification</string>
            </GetMethods>
        </GetMethodsResponse>
    </soapenv:Body>
</soapenv:Envelope>

我目前有以下 xsl 代码 -

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exslt="http://exslt.org/common"
>
    <xsl:output method="html" />

    <xsl:template match="/GetMethods">
        <ul>
            <xsl:for-each select="GetMethods/string">
                <li>
                    <xsl:value-of select="string"/><br/>
                </li>
            </xsl:for-each>    
        </ul>
    </xsl:template>
</xsl:stylesheet>

但这所做的只是将每个字符串节点打印为没有列表格式的长行。任何帮助,将不胜感激。

我想要这个简单的输出:

    <ul>
        <li>GetDomainMembers</li>
        <li>GetDomainNames</li>
        <li>GetMethods</li>
        <li>pingURL</li>
        <li>GetAllMeters</li>
        <li>GetAllServiceLocations</li>
        <li>GetAllCustomers</li>
        <li>GetCustomerByCustId</li>
        <li>GetServiceLocationByAccountNo</li>
        <li>GetServiceLocationByMeterNo</li>
        <li>ReadingChangedNotification</li>
    </ul>

我目前正在得到这个输出(没有格式):

                                          GetDomainMembers            GetDomainNames            GetMethods            pingURL            GetAllMeters            GetAllServiceLocations            GetAllCustomers            GetCustomerByCustId            GetServiceLocationByAccountNo            GetServiceLocationByMeterNo            ReadingChangedNotification                  
4

2 回答 2

2
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exslt="http://exslt.org/common"
    xmlns:response="http://www.url.org/Version_3.0"
    exclude-result-prefixes="exslt response"
>
    <xsl:output method="html" />

    <xsl:template match="/">
        <xsl:apply-templates select="//response:GetMethods" />
    </xsl:template>

    <xsl:template match="response:GetMethods">
        <ul>
            <xsl:apply-templates select="response:string" />
        </ul>
    </xsl:template>

    <xsl:template match="response:string">
        <li>
            <xsl:value-of select="." />
        </li>
    </xsl:template>
</xsl:stylesheet>

笔记:

  • 首先,我们必须知道您的响应元素所在的名称空间。在您的情况下,名称空间 URI 是http://www.url.org/Version_3.0,我们需要将其分配给前缀以使其在 XSLT 中可用。我选择调用该前缀response
  • 接下来我们需要控制 XSLT 的输出。通过匹配根节点 ( ) 并通过直接选择进行处理<xsl:template match="/">来定义下一步要去哪里,这是最简单的。//response:GetMethods
  • response:GetMethods用于和response:string定义其余转换的模板。
  • 最后,我们必须确保 XML 命名空间前缀不会出现在生成的 HTML 中。就是exclude-result-prefixes这样。
  • 在这里看到它:http ://www.xmlplayground.com/kS1Cul
  • 您还可以阅读XSL 中的“调用模板”和“应用模板”有什么区别?我解释<xsl:apply-templates>得更近一点。
  • 一般来说,你应该避免写作<xsl:for-each>,而是选择<xsl:apply-templates>
于 2013-01-09T20:07:28.463 回答
1

您给定的输入中没有与 pattern 匹配的元素"/GetMethods"。因此,您的 XML 可能正在由默认模板处理(尽管我们不知道没有查看 XSLT 的其余部分)。默认模板输出每个元素的文本内容。

为了解决这个问题,

  1. 您的匹配模式不应以 开头/,因为GetMethods它不是顶级元素。如果您的意思是//GetMethods,那将匹配<GetMethods>出现在任何地方的元素(在无命名空间中)。但模式也会如此GetMethods//开头是多余的。
  2. 您需要为GetMethods. 根据您输入的 XML,GetMethods它位于 URI 为的命名空间中http://www.test.org/Version_3.0。因此,您需要为该命名空间声明一个命名空间前缀(例如“test”)并在匹配模式中使用它:

_

 <xsl:template match="test:GetMethods"
      xmlns:test="http://www.test.org/Version_3.0">...

实际上,将命名空间声明 ( xmlns:test="...") 移动到顶级<xsl:stylesheet>元素(如果您还没有的话)可能更实际。然后test前缀将在您需要的样式表中的任何位置可用。

于 2013-01-09T19:26:15.423 回答