输入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,但是如果请求很大,那么是否有任何替代解决方案。提前谢谢。
答案 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>