如何在简单类型重复时使用xslt转换转换Xml
本文关键字:转换 xslt Xml 简单 类型 | 更新日期: 2023-09-27 18:22:44
我正在尝试使用xslt转换将一个xml转换为另一个xml。当有一个复杂的节点重复时,所有节点都会被正确地转换,一切都很好。如果简单类型是重复的,则转换相同数量的节点,但所有节点的值都是第一个节点的值。
这是xml 的一部分
<GetDataResult xmlns="http://tempuri.org/">
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">0</string>
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">1</string>
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">2</string>
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">3</string>
</GetDataResult>
这是我的Xslt片段部分
<response>
<xsl:for-each select="ns1:GetDataResponse/ns1:GetDataResult/ns2:string" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<item>
<xsl:value-of select="/ns1:GetDataResponse/ns1:GetDataResult/ns2:string/text()" />
</item>
</xsl:for-each>
</response>
我为每个循环尝试了几个Xslt组合,但最终结果如下。所有项目都具有第一个重复节点的值。
<?xml version="1.0" encoding="utf-16"?>
<Fields>
<response>
<item>0</item>
<item>0</item>
<item>0</item>
<item>0</item>
</response>
</Fields>
这是it转换代码片段。
XmlDocument xslDoc = new XmlDocument();
xslDoc.InnerXml = XsltCode;
System.Xml.Xsl.XslTransform xslTransform = new System.Xml.Xsl.XslTransform();
StringWriter xmlResult = new StringWriter();
try
{
//Load XSL Transform Object
xslTransform.Load(xslDoc, new XmlUrlResolver(), null);
//Load the xsl parameter if Any
System.Xml.Xsl.XsltArgumentList xslArgs = new System.Xml.Xsl.XsltArgumentList();
//Call the actual Transform method
xslTransform.Transform(xmlDoc, null, xmlResult, new XmlUrlResolver());
}
catch
{ }
string firstParse = xmlResult.ToString();
在每次迭代中使用相对XPath获取当前ns2:string
的值:
<xsl:for-each select="ns1:GetDataResponse/ns1:GetDataResult/ns2:string" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<item>
<xsl:value-of select="." />
</item>
</xsl:for-each>