C# XSLT-更改XML格式和可重用性

C# XSLT-更改XML格式和可重用性,c#,xml,parsing,xslt,C#,Xml,Parsing,Xslt,我可以在XML转换方面获得一些帮助,我也看过其他类似的问题,但由于我的XML模式有点笨拙,我在应用它时遇到了困难 这是我的XML格式 <root> <row> <var name="Name" value="Rusell" /> <var name=" Surname" value=" Anthony" /> <var name=" Country" value=" UK" /> <var name=" Job

我可以在XML转换方面获得一些帮助,我也看过其他类似的问题,但由于我的XML模式有点笨拙,我在应用它时遇到了困难

这是我的XML格式

<root>
  <row>
  <var name="Name" value="Rusell" />
  <var name=" Surname" value=" Anthony" />
  <var name=" Country" value=" UK" />
  <var name=" Job" value="Web Designer" />
  <var name=" Cabin" value="345" />
 </row>
  <row>
  <var name="Name" value="Wolf" />
  <var name=" Surname" value=" Werner" />
  <var name=" Country" value=" Germany" />
  <var name=" Job" value="Linux IT" />
  <var name=" Cabin" value="234" />
 </row>
</root>
也就是说,与我在上面尝试做的相同,但可重复使用,因为我不需要知道名称值(姓氏、小屋等),所以它适用于我的第一个XML文件和以下文件

<root>
  <row>
  <var name="differentName" value="x" />
  <var name="anotherdifferentname" value="y" />
 </row>
  </root>

如果我需要更清楚,请提前告诉我并表示感谢。

这样就可以了

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="xml" indent="yes"/>

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

  <xsl:template match="row">
    <row>
      <xsl:apply-templates select="var"></xsl:apply-templates>
    </row>
  </xsl:template>

  <xsl:template match="var">
    <xsl:variable name="attributeName" select="@name">
    </xsl:variable>
    <xsl:attribute name="{$attributeName}">
      <xsl:value-of select="@value"/>
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>


你已经得到了答案,但有时我觉得更重要的是告诉人们他们做错了什么。基本上你的路径到处都是,看起来像是胡乱猜测。在与行匹配的模板中,Anthony的路径是
var[@name='name']/@value
——也就是说,选择“name”属性等于“姓氏”的子“var”元素,然后选择这个“var”元素的“value”属性。是的,我感谢您的批评,我对XSL一无所知,这可能对您来说是显而易见的。谢谢你解释这个问题syntax@MichaelKay-如果你能回答你的评论,我们就可以投票了,那就太好了(是的,我知道OP已经接受了另一个,但是你的解决方案更合适)。很好,我还没有测试过这个,我很快就会测试,但是你已经为我列出了语法,非常感谢
<xsl:template match="/">
<root>
<xsl:apply-templates/>

</root>
</xsl:template>

<xsl:template match="row">

<row>
<xsl:attribute name="Name">
<xsl:value-of select="value"/>

</xsl:attribute>
<xsl:attribute name="Surname">
<xsl:value-of select="row/root/name/value"/>

</xsl:attribute>
<xsl:attribute name="Country">
<xsl:value-of select="root/row/value"/>

</xsl:attribute>
<xsl:attribute name="Job">
<xsl:value-of select="@value"/>

</xsl:attribute>
<xsl:attribute name="Cabin">
<xsl:value-of select="value"/>

</xsl:attribute>

</row>

</xsl:template>
For each Node = root/row
Create row = (value@name & value@value)
<root>
  <row>
  <var name="differentName" value="x" />
  <var name="anotherdifferentname" value="y" />
 </row>
  </root>
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="xml" indent="yes"/>

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

  <xsl:template match="row">
    <row>
      <xsl:apply-templates select="var"></xsl:apply-templates>
    </row>
  </xsl:template>

  <xsl:template match="var">
    <xsl:variable name="attributeName" select="@name">
    </xsl:variable>
    <xsl:attribute name="{$attributeName}">
      <xsl:value-of select="@value"/>
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>