【问题标题】:How to write xelement value as comma separated into another xelement如何将xelement值写为逗号分隔到另一个xelement
【发布时间】:2015-12-22 19:33:29
【问题描述】:

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

但它不起作用。有什么帮助吗?

【问题讨论】:

  • 很难说,因为我们不知道 xsl:variable 的上下文是什么,而且您没有告诉我们“但它不起作用”的真正含义,但请尝试更改您的 @987654324 @到&lt;xsl:value-of select="."/&gt;
  • 我需要将其转换为另一个 xslt 所以需要变量帮助

标签: c# xml xslt xpath


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试这个

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

    【讨论】:

    • 我正在将此 xslt 转换为另一个 xslt 。所以它不会工作
    猜你喜欢
    • 2015-05-16
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多