Xslt 应用模板时出现问题
我有一个xml,我希望得到如下所示的预期格式。我试图使用应用模板的概念,以这个。但是有些怎么了,我看不到预期的结果Xslt 应用模板时出现问题,xslt,Xslt,我有一个xml,我希望得到如下所示的预期格式。我试图使用应用模板的概念,以这个。但是有些怎么了,我看不到预期的结果 <?xml version="1.0" encoding="UTF-8"?> <SOAP:ENV> <SOAP:HEADER/> <SOAP:BODY> <OutputResponse> <RespStructure ID="1">
<?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,因为它不像其他元素那样重复出现(在第二个模板中介绍)。谢谢你的时间和帮助。