如何从xslt中具有相同名称的节点中提取字符串

时间:2017-04-24 07:40:05

标签: c# asp.net xml xslt xsd

我有4个类似的节点,有4个不同的值。例如,我有以下值。

<sample>
        <a>123</a>
        <a>45</a>
        <a>67</a>
        <a>890</a>
</sample>

我需要检查每个节点的长度,如果它小于3,那么前导零应该如下所示。

<sample>
        <a>123</a>
        <a>045</a>
        <a>067</a>
        <a>890</a>
</sample>

在追加前导零之后,我需要将所有值连接在一起并将其作为单个字符串传递。

<a>123045067890</a>

请提供最佳解决方案。

3 个答案:

答案 0 :(得分:1)

这是使用XPath的一种方法:

string xml = @"
    <sample>
        <a>123</a>
        <a>45</a>
        <a>67</a>
        <a>890</a>
    </sample>
";

//load xml
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(xml);

//get all <a> nodes and cast them to List<XmlNode>
var nodes = xdoc.SelectNodes("sample/a")
    .Cast<XmlNode>().ToList();

//iterate through each node and append leading zeroes until length is 3 chars
nodes.ForEach(n => n.InnerText = n.InnerText.PadLeft(3, '0'));
//join all values and add tags to beginning and the end
string concatenatedValues = "<a>" + string.Join("", nodes.Select(x => x.InnerText).ToArray()) + "</a>";

答案 1 :(得分:1)

以下样式表:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="sample">
    <a>
        <xsl:for-each select="a">
            <xsl:value-of select="format-number(., '000')" />
        </xsl:for-each>
    </a>
</xsl:template>

</xsl:stylesheet>

应用于您的示例输入,返回:

<?xml version="1.0" encoding="UTF-8"?>
<a>123045067890</a>

答案 2 :(得分:0)

你可以试试这个:

string xml = @"<sample>
                        <a>123</a>
                        <a>45</a>
                        <a>67</a>
                        <a>890</a>
                    </sample>";

XDocument xmlDoc = XDocument.Parse(xml);
int value = 0;
StringBuilder errorsSb = new StringBuilder();
List<string> a_Nodes = new List<string>();

xmlDoc.Descendants("a").Select(x => x.Value).ToList().ForEach(x =>
{
     if (int.TryParse(x, out value))
          a_Nodes.Add(value.ToString("D3"));
     else
          errorsSb.AppendLine($"Value {value} is not a number");
     });

     string res = String.Join(string.Empty, a_Nodes);
     if (!string.IsNullOrWhiteSpace(errorsSb.ToString()))
     {
          // handle errors
     }
}