Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XSLT将一个xml标记值移动到另一个xml标记值_C#_Xml_Xslt - Fatal编程技术网

C# XSLT将一个xml标记值移动到另一个xml标记值

C# XSLT将一个xml标记值移动到另一个xml标记值,c#,xml,xslt,C#,Xml,Xslt,我有一个具有以下结构的xml文件: <root> <header> <filename>file.txt</filename> </header> <orders> <order> <name>foo bar</name> </order> <order> <name>foo bar</name> &

我有一个具有以下结构的xml文件:

<root>
 <header>
  <filename>file.txt</filename>
 </header>
 <orders>
  <order>
    <name>foo bar</name>
  </order>
  <order>
    <name>foo bar</name>
  </order>
  ...
 </orders>
</root>

file.txt
富吧
富吧
...
但是我想去掉标记,因此结果xml应该如下所示:

<root>
 <header>
  <filename>file.txt</filename>
 </header>
 <orders>
  <order>
    <filename>file.txt</filename>
    <name>foo bar</name>
  </order>
  <order>
    <filename>file.txt</filename>
    <name>foo bar</name>
  </order>
  ...
 </orders>
</root>
<?xml version="1.0" encoding="utf-16"?>
<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:template match="/root">
    <xsl:variable name="filename" select="header/filename"/>
    <xsl:element name="root">
        <xsl:for-each select="*">
            <xsl:choose>
            <xsl:when test="local-name()='orders'">
                <xsl:element name="orders">
                    <xsl:for-each select="*">
                        <xsl:element name="order">
                            <xsl:element name="filename" >
                                <xsl:value-of select="$filename"/>
                            </xsl:element>
                            <xsl:copy-of select="*"/>
                        </xsl:element>
                    </xsl:for-each>
                </xsl:element>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy-of select="."/>
            </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>

file.txt
file.txt
富吧
file.txt
富吧
...
换句话说,我需要把标签放到每个元素中。
使用XSLT最简单的方法是什么?

您需要使用标识转换模板开始编码

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@*| node()"/>
  </xsl:copy>
</xsl:template>

首先,需要创建xslt样式表来转换xml。工作示例如下所示:

<root>
 <header>
  <filename>file.txt</filename>
 </header>
 <orders>
  <order>
    <filename>file.txt</filename>
    <name>foo bar</name>
  </order>
  <order>
    <filename>file.txt</filename>
    <name>foo bar</name>
  </order>
  ...
 </orders>
</root>
<?xml version="1.0" encoding="utf-16"?>
<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:template match="/root">
    <xsl:variable name="filename" select="header/filename"/>
    <xsl:element name="root">
        <xsl:for-each select="*">
            <xsl:choose>
            <xsl:when test="local-name()='orders'">
                <xsl:element name="orders">
                    <xsl:for-each select="*">
                        <xsl:element name="order">
                            <xsl:element name="filename" >
                                <xsl:value-of select="$filename"/>
                            </xsl:element>
                            <xsl:copy-of select="*"/>
                        </xsl:element>
                    </xsl:for-each>
                </xsl:element>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy-of select="."/>
            </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>


您可以在此处找到如何转换xml文档: