如何在简单类型重复时使用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();

如何在简单类型重复时使用xslt转换转换Xml

在每次迭代中使用相对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>