使用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 中的子节点值对它们进行排序
将命名空间从 java 传递给 xslt,并使用 java 中的参数作为 xslt 中的节点