Xslt 应用模板时出现问题

Xslt 应用模板时出现问题,xslt,Xslt,我有一个xml,我希望得到如下所示的预期格式。我试图使用应用模板的概念,以这个。但是有些怎么了,我看不到预期的结果 <?xml version="1.0" encoding="UTF-8"?> <SOAP:ENV> <SOAP:HEADER/> <SOAP:BODY> <OutputResponse> <RespStructure ID="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是一个多值节点集(国家、首都)。当我使用apply templates时,要么只选择first 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>


谢谢你的回复。对于拼写错误,我深表歉意。

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

您确实存在一个问题,这可能就是您如何编辑您的问题,即您的原始XML使用了名称空间前缀“SOAP”,但您没有为此前缀声明名称空间。我希望第一行是这样的

<SOAP:ENV xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
<xsl:template match="@*|node()">
    <xsl:copy>
       <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>

如果没有这一点,您将无法将XSLT应用于所有内容

名称空间的使用还意味着第二个模板,匹配的body,将不匹配任何内容

<xsl:template match="Body">

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

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

<SOAP:ENV xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
<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>


Hi forum,我的问题很难理解。谢谢Tim。我尝试了XSLT,保持RespStatus不变,虽然元素名“TransactionStatus”出现了,但元素值填充为null。我对XSLT做了一个小小的调整,尽管它实际上没有什么区别。在Hello Tim上尝试一下,我为那个特定的状态元素应用了XPATH,因为它不像其他元素那样重复出现(在第二个模板中介绍)。谢谢你的时间和帮助。