使用xslt和c#从中选择​​一个xml节点并根据其值添加更多节点[重复]

Posted

技术标签:

【中文标题】使用xslt和c#从中选择​​一个xml节点并根据其值添加更多节点[重复]【英文标题】:Selecting a xml Node from and adding more nodes based on its value using xslt and c# [duplicate] 【发布时间】:2020-02-17 08:03:31 【问题描述】:

作为 xslt 的初学者,我在编写 xslt 时遇到问题。场景如下: 从属性名称为 "Value" 的属性中,我应该检查它是否包含 '^' 符号。如果它包含,我应该为每个由“^”分割的值添加更多属性标签。 我尝试在 xslt 中这样做,但对我得到的输出感到疯狂。 //逻辑 试过这个,但不知道需要在 xsl foreach 中添加什么逻辑才能添加新的属性标签。

请提供我可以学习的任何 xslt 资源。

我可以做 c# xml 之类的东西吗

Function()

var splitstring[]=string.Split('^'); 
XmlAttribute.SetAttribute('Val1','splitstring[0]');
XmlAttribute.SetValue('Val2',splitstring[1]);

输入xml:

<Observation>
<Property Name="Type" Value="1234"/>
<Property Name="Code" Value="CodeA"/>
<Property Name="Value1" Value="12345^Val1^6789"/>
<Property Name="Unit" Value=""/>
<Property Name="Status" Value=""/>
</Observation>

这是输入的xml

输出 xml:

<Observation>
<Property Name="Type" Value="1234"/>
<Property Name="Code" Value="CodeA"/>
<Property Name="Value1" Value="12345"/>
<Property Name="Value2" Value="Val1"/>
<Property Name="Value3" Value="6789"/>
<Property Name="Unit" Value=""/>
<Property Name="Status" Value=""/>
</Observation>
 How can i integrate a c# code (because it's easy) or an xslt logic to make this happen?

【问题讨论】:

我查看的其他答案没有标签的属性。我还需要具有所有属性的输出 xml。 XSLT 代码将帮助我。 我在 xslt 中做了修改,也得到了输出。我使用了 3 个 xsl:variables,然后使用所需的 Name 属性和来自 xsl 变量的值构造 Property 节点。有效。达到 15 次后将发布答案。 【参考方案1】:

试试 Xml Linq:

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

namespace ConsoleApplication137

    class Program
    
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        
            XDocument doc = XDocument.Load(FILENAME);
            List<XElement> properties = doc.Descendants("Property").ToList();
            for (int i = properties.Count - 1; i >= 0; i-- )
            
                XElement property = properties[i];
                string value = (string)property.Attribute("Value");
                if (value.Contains("^"))
                
                    property.ReplaceWith(ReplaceElement(property));
                
            
        
        static List<XElement> ReplaceElement(XElement element)
        
            List<XElement> elements = new List<XElement>();
            string name = (string)element.Attribute("Name");
            string baseName = Regex.Match(name, @"[^\d]+").Value;
            string value = (string)element.Attribute("Value");
            string[] splitValues = value.Split(new char[]  '^' ).ToArray();
            for (int i = 1; i <= splitValues.Length; i++)
            
                elements.Add(new XElement("Property", new XAttribute[]  
                    new XAttribute("Name", baseName + i.ToString()),
                    new XAttribute("Value", splitValues[i - 1])
                ));
            
            return elements;
        

    


【讨论】:

感谢@jdweng,但我如何才能在 xslt 文件中集成 为什么使用 xslt 而不是标准的网络库? 我有一个解析器,它必须发送数据而不是解释数据。我只需要修改 xml,因此 xslt 的东西就出现了 用 XML 说“修改”而不“解释”(解析)是矛盾的。使用 XML,您需要在修改之前解析标签名称。我知道你想说什么,你不需要解释内在文本。但是这种情况下你需要在innertext中找到“^”。 我需要找到 '^' 然后通过 xslt 修改 xml 结构,因此不会打扰代码并在以后保持可配置的内容。

以上是关于使用xslt和c#从中选择​​一个xml节点并根据其值添加更多节点[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将前缀类型添加到重复父节点并使用 XSLT 选择每个元素的所有元素?

如何获取具有相同名称的元素并根据 XSLT 中的子节点值对它们进行排序

使用 XSLT 基于路径选择 XML

将命名空间从 java 传递给 xslt,并使用 java 中的参数作为 xslt 中的节点

使用 XSLT 将具有相同 ID 的元素 (XML) 合并到 txt 文件

根据 XSLT 中的特定节点值获取节点