#c# #xml #xslt
#c# #xml #xslt
Вопрос:
У меня есть такой 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>
Я пытаюсь заменить локальные [002], [Local003], [Local004] и [Local005] на локальные [001] в C # с использованием XSLT. Я новичок в этом.
После замены 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]");
}
}
}
Комментарии:
1. Итак, где вы застряли? C #, XSLT, …?
2. Замена его с помощью C #. Я использую .NET Framework 2.0.
3. если (xpath. Содержит(«//Address»)) { const string LOCAL = «//Address/XPath»; if (!dr.IsNull(«document»)) { XmlNodeList localNodes = xDoc. Выберите узлы (ЛОКАЛЬНЫЕ); если (localNodes != null) { xpath = xpath.Replace( @»Local[d{3}]», «Local[001]»); } } }
Ответ №1:
Я пытаюсь заменить локальные [002], [Local003], [Local004] и [Local005] на локальные [001] в C # с использованием XSLT.
Если вы хотите использовать 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>
Как инициировать преобразование XSLT в .NET, описано в соответствующей документации MSDN ( XslCompiledTransform.Transform()
)
Объяснение: переопределение правила идентификации. Использование стандартных функций XPath contains()
translate()
и concat()
.
Ответ №2:
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");
}
}