如何在XSL中按顺序将所有消息连接在一起?

时间:2018-01-04 09:37:18

标签: .net xml xslt

假设我得到以下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>

2 个答案:

答案 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 表达式从*开始,以匹配任何根标记名称。

XSLT 2.0 中的

value-of指令会打印所有所选标记的值,默认分隔符等于空格。