1

我有一个 xml,我想获得如下所示的预期格式。我正在尝试对此使用应用模板概念。但是有些方法,我无法看到预期的结果。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP:ENV>
    <SOAP:HEADER/>
    <SOAP:BODY>
        <OutputResponse>
            <RespStructure ID="1">
                <RespStatus>Success</RespStatus>
                <RespMessage>
                    <Country>Australia</Country>
                    <Capital>Canberra</Capital>
                </RespMessage>
                <RespMessage>
                    <Country>England</Country>
                    <Capital>London</Capital>
                </RespMessage>
                <RespMessage>
                    <Country>China</Country>
                    <Capital>Beijing</Capital>
                </RespMessage>
            </RespStructure>
        </OutputResponse>
    </SOAP:BODY>
</SOAP:ENV> 

现在在此消息中,我将 RespMessage 和 RespStatus 都作为 RespStructure 的一部分。但是 Respstatus 是一个单一的节点集,而 RespMessage 是一个多值节点集(国家,首都)。当我使用应用模板时,要么只有第一个 RespMessage 被选中(第二个重复没有出现),要么 Respstatus 没有给出它的值。我尝试低于输出。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP:ENV>
    <SOAP:HEADER/>
    <SOAP:BODY>
        <OutputResponse>
            <RespStructure ID="1">
                <TransactionStatus>Success</TransactionStatus>
                <ListOfCountries>
                    <SelectedCountry>Australia</SelectedCountry>
                    <FIrstSelectedCapital>Canberra</FIrstSelectedCapital>
                </ListOfCountries>
                <ListOfCountries>
                    <SelectedCountry>England</SelectedCountry>
                    <FIrstSelectedCapital>London</FIrstSelectedCapital>
                </ListOfCountries>
                <ListOfCountries>
                    <SelectedCountry>China</SelectedCountry>
                    <FIrstSelectedCapital>Beijing</FIrstSelectedCapital>
                </ListOfCountries>
            </RespStructure>
        </OutputResponse>
    </SOAP:BODY>
</SOAP:ENV>

我正在更改所有字段的名称,但我应该得到所有多个节点而不会丢失任何内容。

我使用了来自论坛的以下代码片段,但我未能申请。如何使用以下代码段填充 RespStatus。当我给出不同的模板时,两者都没有被调用,只有一个被打印出来。我也尝试将应用模板更改为更具体的节点集。

<xsl:template match="@*|node()">
    <xsl:apply-templates select="@*|node()" />
</xsl:template>

<xsl:template match="Body">
    <SOAPENV>
        <Header/>
        <OutputResponse>
            <xsl:apply-templates select="@*|node()" />
        </OutputResponse>
    </SOAPENV>
</xsl:template>

<xsl:template match="RespMessage">
    <ListOfCountries>
        <SelectedCountry><xsl:value-of select="Country" /></SelectedCountry>
        <FIrstSelectedCapital><xsl:value-of select="Capital" /></FIrstSelectedCapital>
    </ListOfCountries>
</xsl:template>

感谢您的回复。对任何拼写错误表示歉意。

4

1 回答 1

2

查看您的 XSL 片段,它应该匹配并转换所有RespMessage元素,除非 XSLT 的某些其他部分(您未显示)正在影响事物。

您确实遇到的一个问题(这可能就是您编辑问题的方式)是您的原始 XML 使用名称空间前缀“SOAP”,但您尚未为此前缀声明名称空间。我希望第一行是这样的

<SOAP:ENV xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">

没有这个,您将无法在这一切上应用您的 XSLT。

命名空间的使用也意味着第二个模板,匹配body,不会匹配任何东西

<xsl:template match="Body">

(实际上,它不会匹配任何内容,因为它区分大小写,并且在原始 XML 中它是SOAP:BODY

查看 XSLT 的其余部分,如果您想跨现有元素进行复制而不进行更改,您应该使用标识模板。XSLT 中的第一个模板应如下所示

<xsl:template match="@*|node()">
    <xsl:copy>
       <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>

有了这个,你只需要添加一个模板来匹配,并转换RespStatus

<xsl:template match="RespStatus">
    <xsl:element name="TransactionStatus">
        <xsl:value-of select="." />
    </xsl:element>
</xsl:template>

试试这个 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
<xsl:output omit-xml-declaration="yes" indent="yes" />

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>

<xsl:template match="RespStatus">
    <xsl:element name="TransactionStatus">
        <xsl:value-of select="." />
    </xsl:element>
</xsl:template>

<xsl:template match="RespMessage">
    <xsl:element name="ListOfCountries">
        <SelectedCountry><xsl:value-of select="Country" /></SelectedCountry>
        <FIrstSelectedCapital><xsl:value-of select="Capital" /></FIrstSelectedCapital>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>
于 2013-11-05T08:58:26.263 回答