如何将xelement值写为逗号分隔为另一个xelement

时间:2015-12-22 19:33:30

标签: c# xml xslt xpath

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

"ABC"

试过这个

<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>

但它不起作用。任何帮助非常感谢?

2 个答案:

答案 0 :(得分:0)

试试这个

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()));
        }
    }
}
​

答案 1 :(得分:0)

您可以使用以下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>