使用XSLT的产品相同输出XML用于不同的输入XML格式

时间:2015-07-16 04:59:04

标签: xml xslt xpath

输入XML可以采用以下形式之一:

示例1:

<studentRequest>
  <student> 
      <name>name</name>  
      <address>      
         <state>stateName</state>
         <city>cityName</city>
         <pin>123456</pin>
      </address>
       <no>123</no> 
    </student>
</studentRequest>

示例2

<studentRequest>
  <student>         
      <address>
         <city>cityName</city>
         <pin>123456</pin>
         <state>stateName</state>
      </address>
      <name>name</name>
      <no>123</no>
</student>
</studentRequest>

期望的输出:

<studentRequest>
    <student>
      <address>
         <city>cityName</city>
         <pin>123456</pin>
         <state>stateName</state>
      </address>
      <name>name</name>
      <no>123</no>
    </student>
</studentRequest>

我按如下方式编写了XSLT

<xsl:template match="/">
 <studentRequest>
       <xsl:if test="student">
         <xsl:element name="student">
           <xsl:if test="student/name">
            <xsl:element name="name">
                <xsl:value-of select="student/name"/>
            </xsl:element>
           </xsl:if>
           <xsl:if test="student/no">
            <xsl:element name="no">
                <xsl:value-of select="student/no"/>
            </xsl:element>
           </xsl:if>
            <xsl:if test="student/address">
            <xsl:element name="address">
                ............
                ...............
            </xsl:element>
           </xsl:if>
           </xsl:element>
         </xsl:if>
       </xsl:template>
 </studentRequest>
</xsl:template>

这意味着如果输入XML表单也被更改,我需要使用XSLT生成相同的输出。如果请求很小,我们可以像上面那样编写XSLT,但是如果请求很大,那么是否有任何替代解决方案。提前谢谢。

2 个答案:

答案 0 :(得分:2)

您似乎以某种方式对孩子进行排序,但您只是想复制它们。

进行这些转换的方法始终如下:

  • 以身份模板
  • 开头
  • 仅为您要修改的节点编写模板

喜欢这个

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output indent="yes" />
  <xsl:strip-space elements="*" />

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

  <xsl:template match="student">
    <xsl:copy>
      <xsl:apply-templates select="address" />
      <xsl:apply-templates select="name" />
      <xsl:apply-templates select="no" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="address">
    <xsl:copy>
      <xsl:apply-templates select="city" />
      <xsl:apply-templates select="pin" />
      <xsl:apply-templates select="state" />
    </xsl:copy>
  </xsl:template>

</xsl:transform>

答案 1 :(得分:1)

看起来您只是按名称对子元素进行排序。如果是这样的话,试试这个......

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

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

</xsl:stylesheet>