我有一个像这样的XML文件:
<Adresses>
<Address1>
<XPath>//Address/Local[001]/AddressLine1</XPath>
<Key>1</Key>
</Address1>
<Address2>
<XPath>//Address/Local[002]/AddressLineA</XPath>
<Key>2</Key>
</Address2>
<Address3>
<XPath>//Address/Local[003]/AddressLineBC</XPath>
<Key>3</Key>
</Address3>
<Address4>
<XPath>//Address/Local[004]/AddressLineA1</XPath>
<Key>4</Key>
</Address4>
<Address5>
<XPath>//Address/Local[005]/AddressLineCD1</XPath>
<Key>5</Key>
</Address5>
</Adresses>
我正在尝试使用XSLT在C#中用Local [001]替换Local [002],[Local003],[Local004]和[Local005]。我是新来的。 替换后,XML应如下所示:
<Adresses>
<Address1>
<XPath>//Address/Local[001]/AddressLine1</XPath>
<Key>1</Key>
</Address1>
<Address2>
<XPath>//Address/Local[001]/AddressLineA</XPath>
<Key>2</Key>
</Address2>
<Address3>
<XPath>//Address/Local[001]/AddressLineBC</XPath>
<Key>3</Key>
</Address3>
<Address4>
<XPath>//Address/Local[001]/AddressLineA1</XPath>
<Key>4</Key>
</Address4>
<Address5>
<XPath>//Address/Local[001]/AddressLineCD1</XPath>
<Key>5</Key>
</Address5>
</Adresses>
尝试了这个:
if (xpath.Contains("//Address"))
{
const string LOCAL = "//Address/XPath";
if (!dr.IsNull("document"))
{
XmlNodeList localNodes = xDoc.SelectNodes(LOCAL);
if (localNodes != null)
{
xpath = xpath.Replace( @"Local[\d{3}]", "Local[001]");
}
}
}
答案 0 :(得分:2)
我正在尝试替换Local [002],[Local003],[Local004]和 [Local005]使用XSLT在C#中使用Local [001]。
如果您想使用XSLT,这是一个完整的XSLT转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"XPath/text()
[contains(translate(.,'23456789','00000000'),
'/Local[000]'
)
]">
<xsl:value-of select=
"concat(substring-before(., '['),
'[001]',
substring-after(., ']')
)
"/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于提供的XML文档:
<Adresses>
<Address1>
<XPath>//Address/Local[001]/AddressLine1</XPath>
<Key>1</Key>
</Address1>
<Address2>
<XPath>//Address/Local[002]/AddressLineA</XPath>
<Key>2</Key>
</Address2>
<Address3>
<XPath>//Address/Local[003]/AddressLineBC</XPath>
<Key>3</Key>
</Address3>
<Address4>
<XPath>//Address/Local[004]/AddressLineA1</XPath>
<Key>4</Key>
</Address4>
<Address5>
<XPath>//Address/Local[005]/AddressLineCD1</XPath>
<Key>5</Key>
</Address5>
</Adresses>
产生了想要的正确结果:
<Adresses>
<Address1>
<XPath>//Address/Local[001]/AddressLine1</XPath>
<Key>1</Key>
</Address1>
<Address2>
<XPath>//Address/Local[001]/AddressLineA</XPath>
<Key>2</Key>
</Address2>
<Address3>
<XPath>//Address/Local[001]/AddressLineBC</XPath>
<Key>3</Key>
</Address3>
<Address4>
<XPath>//Address/Local[001]/AddressLineA1</XPath>
<Key>4</Key>
</Address4>
<Address5>
<XPath>//Address/Local[001]/AddressLineCD1</XPath>
<Key>5</Key>
</Address5>
</Adresses>
如何在.NET中启动XSLT转换,请参阅相应的MSDN文档(XslCompiledTransform.Transform()
)
解释:覆盖identity rule。使用标准XPath函数 contains()
, translate()
和 concat()
。
答案 1 :(得分:1)
using System;
using System.Xml;
using System.Text.RegularExpressions;
class Sample {
static void Main(string[] args) {
var doc = new XmlDocument();
doc.Load(@"data.xml");
XmlNodeList nodes = doc.SelectNodes("/Adresses/*/XPath");
Regex regex = new Regex(@"Local\[\d{3}\]");
foreach(XmlNode node in nodes){
node.InnerText = regex.Replace(node.InnerText, "Local[001]");
}
doc.Save(@"data.xml");
}
}