如何将xelement值以逗号分隔的形式写入另一个xelement

本文关键字:xelement 分隔 另一个 | 更新日期: 2023-09-27 18:27:43

在xslt 1.0中,我想将Delivery Method作为逗号分隔的值写入另一个XElement或变量

<Orders>
  <Order>
    <Number>1</Number>
    <GenerateID>Y</GenerateID>
    <DeliveryMethods>
    <DeliveryMethod>Postal</DeliveryMethod>
    <DeliveryMethod>Mail</DeliveryMethod>
    </DeliveryMethods>
    <OrderIdentity>1FTHX26FXVEA28985</OrderIdentity>
    <Price>100</Price>
    <Quantity>5</Quantity>
  </Order>
</Orders>

尝试过这个

<xsl:variable name="DeliveryOptions>
<xsl:for-each select="DeliveryMethods/DeliveryMethod">
   <xsl:value-of select="DeliveryMethod"/>
   <xsl:if test="position() != last()">
      <xsl:text>,</xsl:text>
   </xsl:if>
</xsl:for-each>
</xsl-variable>

但它不起作用。有什么需要帮忙的吗?

如何将xelement值以逗号分隔的形式写入另一个xelement

您可以使用以下XSLT将输入转换为输出,用子元素的逗号分隔值替换一个元素:

  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="@* | node()">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
   </xsl:template>
  <xsl:template match="DeliveryMethods">
    <allmethods>
      <xsl:apply-templates select="DeliveryMethod"/>
    </allmethods>
  </xsl:template>
  <xsl:template match="DeliveryMethod">
    <xsl:value-of select="."/>
    <xsl:if test="position() != last()">
      <xsl:text>,</xsl:text>
    </xsl:if>
  </xsl:template>

我使用一个模板来匹配DeliveryMethods元素。在模板中,元素的新名称将写入输出文档
接下来,我将模板应用于DeliveryMethod元素。

在模板DeliveryMethod中,当前元素值被写入输出。只要元素的position()不等于last(),就写一个逗号。

在给定的输入中,这个XSLT的输出是:

<Orders>
  <Order>
    <Number>1</Number>
    <GenerateID>Y</GenerateID>
    <allmethods>Postal,Mail</allmethods>
    <OrderIdentity>1FTHX26FXVEA28985</OrderIdentity>
    <Price>100</Price>
    <Quantity>5</Quantity>
  </Order>
</Orders>

试试这个

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml =
                "<Orders>" +
                  "<Order>" +
                    "<Number>1</Number>" +
                    "<GenerateID>Y</GenerateID>" +
                    "<DeliveryMethods>" +
                    "<DeliveryMethod>Postal</DeliveryMethod>" +
                    "<DeliveryMethod>Mail</DeliveryMethod>" +
                    "</DeliveryMethods>" +
                    "<OrderIdentity>1FTHX26FXVEA28985</OrderIdentity>" +
                    "<Price>100</Price>" +
                    "<Quantity>5</Quantity>" +
                  "</Order>" +
                "</Orders>";
            XDocument doc = XDocument.Parse(xml);
            XElement deliverMethod = new XElement("DeliveryMethod",string.Join(",",doc.Descendants("DeliveryMethod").Select(x => x.Value).ToArray()));
        }
    }
}
​