【问题标题】:XML dataset transformationXML 数据集转换
【发布时间】:2015-01-16 15:43:17
【问题描述】:

您好,我是 XSLT 的新手,我想转换 Xml 数据集,其中学生姓名从 xml 映射,其中有学生姓名和卷号数据集。分类。

我想使用 xslt,但我不想只添加要映射的列名称标签,而其他列保持原样。

这是输入和输出数据集示例。 xml 是来自 c# 代码的普通 dataset.writexml。

表1:

RollNo    Sub1  Sub2 Sub3 Sub4
1         65    89   67   34
2         67    86   67   76
3         86    67   78   45
4         56    56   87   56
5         76    56   56   78

表2

Name      Sub1  Sub2 Sub3 Sub4
Aman      65    89   67   34
Ankit     67    86   67   76
Om        86    67   78   45
Narendra  56    56   87   56
Faisal    76    56   56   78

这是用于转换的 Xml

映射 XML

<?xml version="1.0" standalone="yes"?>
<School>
    <Class Name="Class1">
        <StudentData Name="Aman" RollNo="1"  />   
        <StudentData Name="Ankit" RollNo="2"  />   
        <StudentData Name="Om" RollNo="3"  />   
        <StudentData Name="Narendra" RollNo="4"  />   
        <StudentData Name="Faisal" RollNo="5"  />    
    </Class>
    <Class Name="Class2">
        <StudentData Name="Abhinav" RollNo="1"  />   
        <StudentData Name="Abhishek" RollNo="2"  />   
        <StudentData Name="Ishaan" RollNo="3"  />   
        <StudentData Name="Mayank" RollNo="4"  />   
        <StudentData Name="Bhavana" RollNo="5"  />    
    </Class>
</School>

到目前为止创建的 XSLT

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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs"
             xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="http://www.contoso.com">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>

  <xsl:template match="/">
    <DocumentElement>
      <xsl:for-each select="//Comparision">
        <xsl:if test ="number(COL7)">
      <PositionMaster>

                    <xsl:variable name="RollNo" select="normalize-space(COL1)"/>
                    <xsl:variable name="Name">
                        <xsl:value-of select="document('../../../MappingFiles/Mapping.xml')/School/PB[@Name='Class1']/TagData[@RollNo=$RollNo]/@Name"/>
                    </xsl:variable>
                    <Name>
                        <xsl:choose>
                            <xsl:when test="$Name!=''">
                                <xsl:value-of select="$Name"/>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:value-of select="$Name"/>
                            </xsl:otherwise>
                        </xsl:choose>
                    </Name>
          </PositionMaster>
        </xsl:if >
      </xsl:for-each>
    </DocumentElement>
  </xsl:template>
</xsl:stylesheet>

谢谢 阿曼

【问题讨论】:

  • 显示你到目前为止所尝试的。
  • 1. 请将您的输入和输出作为 XML 代码发布。 -- ** 2.** 转换如何知道映射 XML 中的哪个 Class 用于查找?
  • @michael.hor257k xslt 将在其中硬编码类名。
  • @king.code 到目前为止,我已经创建了附加的 xslt。这个 xslt 只给出我映射的列。
  • @ChaturvediDewashish 赏金不能代替添加 XML 输入和输出。

标签: c# xml xslt xml-parsing dataset


【解决方案1】:

仅作为示例,给定以下输入 XML

<Table>
    <Student>
        <RollNo>1</RollNo>
        <Sub1>11</Sub1>
        <Sub2>12</Sub2>
        <Sub3>13</Sub3>
    </Student>
    <Student>
        <RollNo>2</RollNo>
        <Sub1>21</Sub1>
        <Sub2>22</Sub2>
        <Sub3>23</Sub3>
    </Student>
    <Student>
        <RollNo>3</RollNo>
        <Sub1>31</Sub1>
        <Sub2>32</Sub2>
        <Sub3>33</Sub3>
    </Student>
    <Student>
        <RollNo>4</RollNo>
        <Sub1>41</Sub1>
        <Sub2>42</Sub2>
        <Sub3>43</Sub3>
    </Student>
    <Student>
        <RollNo>5</RollNo>
        <Sub1>51</Sub1>
        <Sub2>52</Sub2>
        <Sub3>53</Sub3>
    </Student>
</Table>

还有一个名为“Mapping.xml”的外部文件:

<?xml version="1.0" standalone="yes"?>
<School>
    <Class Name="Class1">
        <StudentData Name="Aman" RollNo="1"  />   
        <StudentData Name="Ankit" RollNo="2"  />   
        <StudentData Name="Om" RollNo="3"  />   
        <StudentData Name="Narendra" RollNo="4"  />   
        <StudentData Name="Faisal" RollNo="5"  />    
    </Class>
    <Class Name="Class2">
        <StudentData Name="Abhinav" RollNo="1"  />   
        <StudentData Name="Abhishek" RollNo="2"  />   
        <StudentData Name="Ishaan" RollNo="3"  />   
        <StudentData Name="Mayank" RollNo="4"  />   
        <StudentData Name="Bhavana" RollNo="5"  />    
    </Class>
</School>

以下样式表:

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:param name="class">Class2</xsl:param>

<xsl:key name="student" match="StudentData" use="concat(@RollNo, '|' , ../@Name)" />

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

<xsl:template match="RollNo">
    <Name>
        <xsl:variable name="RollNo" select="." />
        <!-- switch context to the other document in order to use key -->
        <xsl:for-each select="document('Mapping.xml')">
            <xsl:value-of select="key('student', concat($RollNo, '|' , $class))/@Name" />
        </xsl:for-each>
    </Name>
</xsl:template>

</xsl:stylesheet>

将返回:

<?xml version="1.0" encoding="UTF-8"?>
<Table>
   <Student>
      <Name>Abhinav</Name>
      <Sub1>11</Sub1>
      <Sub2>12</Sub2>
      <Sub3>13</Sub3>
   </Student>
   <Student>
      <Name>Abhishek</Name>
      <Sub1>21</Sub1>
      <Sub2>22</Sub2>
      <Sub3>23</Sub3>
   </Student>
   <Student>
      <Name>Ishaan</Name>
      <Sub1>31</Sub1>
      <Sub2>32</Sub2>
      <Sub3>33</Sub3>
   </Student>
   <Student>
      <Name>Mayank</Name>
      <Sub1>41</Sub1>
      <Sub2>42</Sub2>
      <Sub3>43</Sub3>
   </Student>
   <Student>
      <Name>Bhavana</Name>
      <Sub1>51</Sub1>
      <Sub2>52</Sub2>
      <Sub3>53</Sub3>
   </Student>
</Table>

【讨论】:

  • 谢谢,帮了大忙。
猜你喜欢
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多