为给定的XSLT生成XML

时间:2018-12-28 23:40:24

标签: xml xslt

我有一个XSLT文件,我需要生成相应的XML文件。我不知道XML文件应该是什么样子,但是基于XSLT,我们可以猜测它应该是什么样子。

由于我是新手,我需要帮助来正确理解XSLT。

下面的XSLT的XML文件的外观如何?

<xsl:stylesheet version="1.0" exclude-result-prefixes="xsl math exsl">
<xsl:template match="/library">
<all>
<xsl:if test="count(//cupboards) > 100">
<xsl:message terminate="yes">Too many cupboards</xsl:message>
</xsl:if>
<xsl:variable name="val_a">
<value>
<xsl:value-of select="round(math:random() * 10000)"/>
</value>
<value>
<xsl:value-of select="round(math:random() * 10000)"/>
</value>
</value>
</xsl:variable>

<xsl:call-template name="check-library">
<xsl:with-param name="val_a" select="exsl:node-set($val_a)//value"/>
<xsl:with-param name="val_b" select="1"/>
<xsl:with-param name="val_c" select="val_c[position() = 1]/cupboards"/>
<xsl:with-param name="val_d" select="state/val_d"/>
</xsl:call-template>
</all>
</xsl:template>

<xsl:template name="check-library">
<xsl:param name="val_a"/>
<xsl:param name="val_b"/>
<xsl:param name="val_c"/>
<xsl:param name="val_d"/>
<xsl:if test="$val_b > 20000">
<xsl:message terminate="yes">Check 1</xsl:message>
</xsl:if>

<xsl:if test="count($val_d) > 200">
<xsl:message terminate="yes">
Check 2
</xsl:message>
</xsl:if>

<xsl:if test="count($val_c) > 0">
<xsl:variable name="c" select="$val_c[1]"/>
<xsl:variable name="r" select="$val_c[position()>1]"/>
<xsl:choose>
<xsl:when test="count($c/something) = 1">
<xsl:message>
<val_a>
<xsl:copy-of select="$val_a"/>
</val_a>
</xsl:message>

<xsl:message>
<val_d>
<xsl:copy-of select="$val_d"/>
</val_d>
</xsl:message>

<xsl:call-template name="check-library">
<xsl:with-param name="val_a" select="$val_a"/>
<xsl:with-param name="val_b" select="$val_b + 1"/>
<xsl:with-param name="val_c" select="$r"/>
<xsl:with-param name="val_d" select="$val_d"/>
</xsl:call-template>

<xsl:when test="count($c/something2) = 1">
<xsl:variable name="val_e">
<value>
<xsl:value-of select="$c/something2 + 0"/>
</value><xsl:copy-of select="$val_d"/>
</xsl:variable>

<xsl:call-template name="check-library">
<xsl:with-param name="val_a" select="$val_a"/>
<xsl:with-param name="val_b" select="$val_b + 1"/>
<xsl:with-param name="val_c" select="$r"/>
<xsl:with-param name="val_d" select="exsl:node-set($val_e)//value"/>
</xsl:call-template>
</xsl:when>

我试图制作一个XML,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<library>
<val_c>
<cupboards>
<something>
</something>
</cupboards>
</val_c>
</library>
<state>
<val_d>
something
</val_d>
<state>

但是,它不是正确的XML。

如果我为库树节点放置了100个以上的橱柜子节点,则会收到消息:“橱柜太多”。所以,那部分是正确的。

但是我不明白在检查库模板中如何进行检查。

有人可以帮助我理解此XSLT并显示相应的XML外观吗?

然后,我可以编写代码为这种形式的给定XSLT自动生成XML。

谢谢。

1 个答案:

答案 0 :(得分:2)

这是一项完全绝望的任务,特别是如果出于隐私原因向我们隐藏XSLT代码的一部分,并且XSLT代码明显不正确(在结束{{1}之后的xsl:when元素} ???)

这绝对不是一项可以自动化的任务。

您可能希望做的最好的事情就是弄清楚一些结构:样式表期望一个名为</xsl:stylesheet>的根元素,一个名为library的后代元素以及一个名为{{1}的子元素}和cupboard,以及称为val_cstate的其他元素。如果名称更有用(例如,如果名称是“ city”和“ state”而不是“ val_c”和“ state”),则您可以根据名称的选择做出一些猜测。这些猜测当然可能是完全错误的。

由于样式表未使用something,因此可以进行一些数据流分析并计算出,例如,从未真正使用根模板中分配的随机值(至少不,在您选择向我们展示的部分代码中)。但是XSLT通常无法进行这种分析,因为大多数样式表的确使用something2,并且在不了解源文档结构的情况下,您无法对模板规则调用进行任何静态分析。 / p>