使用XSLT文件将XML转换为XML

时间:2018-11-07 21:20:48

标签: xml xslt

我正在尝试将XML从一种格式转换为另一种格式,但是没有足够的运气来寻找能够解释XML如何很好地工作的资源。如何使用其他XML标签内的值设置XML标签内的数据?

这是开始的XML

<?xml version="1.0" encoding="utf-8"?>
<In xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="in.xsd">
  <Submit ID="1234">
    <Label>
      <Code>300</Code>
      <Source>27</Source>
    </Label>
    <Data>
      <Number>18</Number>
      <Date>2018-04-01</Date>
      <IsFile>0</IsFile>
      <Location></Location>
      <Files>
        <File>
          <Name>red.pdf</Name>
          <Classification>FILE</Classification>
        </File>
        <File>
          <Name>picture.pdf</Name>
          <Type>IMAGE</Type>
        </File>
      </Files>
    </Data>
  </Submit>
</In>

我当前的XSLT

<?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="/">
    <xsl:apply-templates select="In"/>
  </xsl:template>
  <xsl:template match="In">
    <Q xmlns:tns="Q" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Source="{@source}" Notification="true">
      <xsl:value-of select="Submit/Label/Source"/>
    </Q>
  </xsl:template>
</xsl:stylesheet>

使用XSLT转换XML文件后的预期最终结果。

<?xml version="1.0" encoding="utf-8"?>
<Q xmlns:tns="Q" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="scheme.xsd" Source="27" Notification="true">
<SubmitID="1234">
<Label>
    <Code>300</Code>
    <Source>27</Source>
</Label>
<Data>
    <Number>18</Number>
    <Date>2018-04-01</Date>
    <IsFile>0</IsFile>
</Data>
<Files>
    <File>
        <Name>red.pdf</Name>
        <Type>FILE</Type>
    </File>
    <File>
        <Name>picture.pdf</Name>
        <Type>IMAGE</Type>
    </File>
</Files>
</Submit>
</Q>

XSLT不完整,无法产生预期的结果。我仍然缺少生成介于两者之间的代码。

2 个答案:

答案 0 :(得分:1)

请尝试以下XSLT-1.0样式表:

<?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"/>

  <!-- identity template - copies all elements and its children and attributes -->    
  <xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*" />
      </xsl:copy>
  </xsl:template>    

  <xsl:template match="/In">                   <!-- Remove the 'In' element -->
    <xsl:apply-templates select="node()"/>
  </xsl:template>

  <xsl:template match="Submit">                <!-- Create the 'Q' element and its sub-elements -->
    <Q xmlns:tns="Q" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Source="{@source}" Notification="true">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates select="Label" />
            <xsl:apply-templates select="Data" />
            <xsl:apply-templates select="Data/Files" />
        </xsl:copy>
    </Q>
  </xsl:template>

  <xsl:template match="Data">                  <!-- Create the 'Data' sub-element without all of its children -->
    <xsl:copy>
        <xsl:copy-of select="Number"/>
        <xsl:copy-of select="Date"/>
        <xsl:copy-of select="IsFile"/>
    </xsl:copy>
  </xsl:template>  

</xsl:stylesheet>

答案 1 :(得分:0)

这将返回我的大部分需求。这是正确的方法吗?

<?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="/">
    <xsl:apply-templates select="In"/>
  </xsl:template>

  <xsl:template match="In">
    <Q xmlns:tns="Q" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Source="{Submit/Label/Source}" Notification="true">
      <xsl:value-of select="Submit/Label/Source"/>
      <Label>
      <Code><xsl:value-of select="Submit/Label/Code"/></Code>
      <Source><xsl:value-of select="Submit/Label/Source"/></Source>
      </Label>
    </Q>
  </xsl:template>
</xsl:stylesheet>