假设我得到以下XML:
<Gift>
<GiftWrapId>026272275</GiftWrapId>
<ClientIItemId>191267166704</ClientIItemId>
<GiftMessageSequence>1</GiftMessageSequence>
<GiftMessageType>GIFT</GiftMessageType>
<GiftMessage>Happy Birthday, sweet</GiftMessage>
</Gift>
<Gift>
<GiftWrapId>026272275</GiftWrapId>
<ClientIItemId>191267166704</ClientIItemId>
<GiftMessageSequence>2</GiftMessageSequence>
<GiftMessageType>GIFT</GiftMessageType>
<GiftMessage>Konnie</GiftMessage>
</Gift>
我希望结果是生日快乐,甜美的康妮&#39;但是连接“GiftMessage”&#39;按照&#39; GiftMessageSequence&#39;中提到的顺序排列标记:
<CommentInfo>
<CommentType>X</CommentType>
<xsl:element name="CommentText">
<xsl:value-of select="*Happy Birthday, sweet Konnie should come here*"/>
</xsl:element>
</CommentInfo>
答案 0 :(得分:0)
假设<GiftMessageSequence>
有一个数值,您可以在节点上执行排序,然后在<GiftMessage>
中连接值以获取完整的消息。
在<root>
节点中包装输入XML并在其上应用下面的XSLT,将提供所需的输出。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="root">
<xsl:variable name="message">
<xsl:for-each select="Gift">
<xsl:sort select="GiftMessageSequence" data-type="number" order="ascending" />
<xsl:value-of select="concat(GiftMessage, ' ')" />
</xsl:for-each>
</xsl:variable>
<CommentInfo>
<CommentType>X</CommentType>
<CommontText>
<xsl:value-of select="normalize-space($message)" />
</CommontText>
</CommentInfo>
</xsl:template>
</xsl:stylesheet>
输出
<CommentInfo>
<CommentType>X</CommentType>
<CommontText>Happy Birthday, sweet Konnie</CommontText>
</CommentInfo>
答案 1 :(得分:0)
由于您的来源包含多个Gift
代码,因此必须包含这些代码
包含在某些 root 标记中(为了形成正确的XML)。
然后,在 XSLT 2.0 中,脚本可以如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<CommentInfo>
<CommentType>X</CommentType>
<CommentText>
<xsl:variable name="msg">
<xsl:for-each select="*/Gift">
<xsl:sort select="GiftMessageSequence"/>
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="$msg/Gift//GiftMessage"/>
</CommentText>
</CommentInfo>
</xsl:template>
</xsl:stylesheet>
msg
变量收集所有Gift
个元素,按其排序
GiftMessageSequence
。
请注意, XPath 表达式从*
开始,以匹配任何根标记名称。
value-of
指令会打印所有所选标记的值,默认分隔符等于空格。