XSLT转换仅显示第一个匹配

时间:2015-10-05 03:05:56

标签: xml xslt transform

我是xsl的新手,我正在尝试使用xslt将soap响应转换为简单的html。我想要的结果应该在段落列表中显示每个siteSummaryList节点的子节点。我的问题是输出只显示第一个匹配(下例中的TEST SITE 1)。奇怪的是,它显示两次,表示它确实找到第二个匹配但再次显示第一个数据。任何人都可以看到或解释我的错误做法吗?

由于

XML

<ns:getSitesResponse xmlns:ns="http://scada.api.web.companyx">
<ns:return 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:ax226="http://scada.response.entity.web.companyx/xsd" xsi:type="ax226:SiteSummaryResponse">

<ax226:siteSummaryList xsi:type="ax226:SiteSummary">
<ax226:alarmCount>8</ax226:alarmCount>
<ax226:label>TEST SITE 1</ax226:label>
<ax226:typeLabel>TYPE 1</ax226:typeLabel>
</ax226:siteSummaryList>

<ax226:siteSummaryList xsi:type="ax226:SiteSummary">
<ax226:alarmCount>6</ax226:alarmCount>
<ax226:label>TEST SITE 2</ax226:label>
<ax226:typeLabel>TYPE 2</ax226:typeLabel>
</ax226:siteSummaryList>
</ns:return>
</ns:getSitesResponse>

XSLT

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:p="http://scada.response.entity.web.companyx/xsd" exclude-result-prefixes="p">

<xsl:output method="html" indent="no" />

    <xsl:template match="/">
                <xsl:apply-templates select="//p:siteSummaryList" />
    </xsl:template>

    <xsl:template match="//p:siteSummaryList">
        <p><xsl:value-of select="//p:label" /></p>
        <p><xsl:value-of select="//p:typeLabel" /></p>
        <p><xsl:value-of select="//p:alarmCount" /></p>         
    </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

变化:

<xsl:value-of select="//p:label" />

为:

<xsl:value-of select="p:label" />

表达式//p:label从根节点开始选择整个文档中的所有p:label个节点 - 并且(在XSLT 1.0中)xsl:value-of返回的字符串值其中之一。

另请注意,使用//启动匹配模式是多余的。