【发布时间】:2015-07-16 04:59:04
【问题描述】:
输入的 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,但是如果请求很大,那么是否有任何替代解决方案。提前致谢。
【问题讨论】:
-
请注意,
<xsl:element>始终是不必要的除非您要设置计算元素名称。<xsl:element name="student">是评估者复杂的说法<student>。 -
您犯了一个典型的错误,即尝试使用单个示例指定您的需求,然后告诉我们该示例不足以解释完整的需求。从更好的需求声明重新开始。决定输出中元素顺序的规则是什么?
-
@MichaelKay 实际上原始示例非常大,所以我为此创建了小示例。这里没有规则。实际上,我们正在形成 WSIL 文件中存在的 SOAP 请求。为此,我们得到xml文件有不同的形式。但最后我们需要根据WSIL形成请求。你明白我说的吗?对不起我的英语不好。
-
如果没有规则来确定输出的顺序,那么就没有办法编写程序以正确的顺序产生输出。