所以,我之前问过一个问题:XSLT selecting mulitple nodes with different namespaces
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:head="http://www/example.com">
<soap:Header>
<head:sampleHeaderType>
<head:messageId>xxxxxxxx</head:messageId>
<head:SID>XXX</head:SID>
<head:BID>SP</head:BID>
<head:CTS>2014-09-26T13:19:30.534Z</head:CTS>
</head:sampleHeaderType>
</soap:Header>
<soap:Body>
<cass:SPD xmlns:cass="http://blahblahblah">
<cass:SPR>
<cass:RQ RT="Describe" FG="LOL" PD="09/22/2014" />
</cass:SPR>
<cass:SPS>
<cass:SP SPT="Standard" FT="Retail" PS="New" ICT="APR" >
<cass:DR DN="306532" BR="0.0790000">
<cass:FFMR ValueType="$" Value="0"/>
<cass:RV ReserveType="DP">
<cass:RTS TT="DP">
<cass:RT TMin="0" TMax="0.999999" TVT="%" TV="100"/>
</cass:RTS>
</cass:RV>
</cass:DR>
<cass:Product PID="Sirius" PN="Sirius"/>
</cass:SP>
<cass:SP SPT="Standard" FT="Retail" PS="New" ICT="APR">
<cass:DR DN="306532" BR="0.1520000">
<cass:FFMR ValueType="$" Value="0"/>
<cass:RV RT="DP">
<cass:RTS TT="DP">
<cass:RT TMin="0" TMax="0.999999" TVT="%" TV="100"/>
</cass:RTS>
</cass:RV>
</cass:DR>
<cass:Product PID="Sirius" PN="Sirius"/>
</cass:SP>
</cass:SPS>
<cass:SPMS>
<cass:SPM MessageCode="" MessageType="" MessageText=""/>
</cass:SPMS>
</cass:SPD>
</soap:Body>
</soap:Envelope>
现在我有了样式表
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:cass="http://blahblahblah" xmlns:head="http://www/example.com" exclude-result-prefixes="soap cass head">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="soap:Header" />
<xsl:template match="cass:SPD">
<xsl:for-each select=".//cass:SP">
<xsl:apply-templates select="*/cass:SPM"/>
<xsl:apply-templates select="*/cass:RQ"/>
<xsl:apply-templates select="*/cass:SP"/>
</xsl:for-each>
</xsl:template>
<xsl:template match="*/cass:RQ">
<RT>
<xsl:value-of select="@RT"/>
</RT>
<FG>
<xsl:value-of select="@FG"/>
</FG>
<PD>
<xsl:value-of select="@PD"/>
</PD>
</xsl:template>
<xsl:template match="*/cass:SPM">
<MESSAGE_TXT>
<xsl:value-of select="@MessageText"/>
</MESSAGE_TXT>
</xsl:template>
</xsl:stylesheet>
所以,基本上对于每个cass:SP我想生成单独的EVAPP_SP元素,其中包含从xml的不同部分中选择的节点。我希望这很清楚,我不善于阐述这个问题。
答案 0 :(得分:0)
匹配cass:SPD
<xsl:template match="cass:SPD">
<xsl:for-each select=".//cass:SP">
<xsl:apply-templates select="*/cass:SPM"/>
<xsl:apply-templates select="*/cass:RQ"/>
<xsl:apply-templates select="*/cass:SP"/>
</xsl:for-each>
</xsl:template>
因此,在模板中,您最初定位在cass:SPD
上。然后,您可以for-each
在此下的任何级别获取cass:SP
。到现在为止还挺好。但是你使用xpath表达式*/cass:SPM
。因为在循环内,您的上下文现在位于cass:SP
,所以这将查找cass:SPM
的子元素cass:SP
元素。但没有。 cass:SPM
是cass:SPD
的大孩子。同样适用于cass:SR
。
在不知道您希望实现什么输出的情况下很难给出准确的答案,但有可能在这里根本不需要for-each
<xsl:template match="cass:SPD">
<xsl:apply-templates select="*/cass:SPM"/>
<xsl:apply-templates select="*/cass:RQ"/>
<xsl:apply-templates select="*/cass:SP"/>
</xsl:template>
这至少会给出一些结果。