为给定XSLT生成XML

为给定XSLT生成XML,xml,xslt,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="

我有一个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>

碗橱太多
检查1
支票2
我尝试创建一个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

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

但我不明白检查库模板中的检查是如何执行的

有人能帮我理解这个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>
然后,我可以编写代码,为这种表单的给定XSLT自动生成XML


谢谢。

这是一项完全没有希望的任务,特别是如果您出于隐私原因对我们隐瞒了部分XSLT代码,并且XSLT代码明显不正确(在关闭
后立即添加
xsl:when
元素)

这当然不是一项可以自动化的任务

您希望做的最好的事情就是计算出一些结构:样式表需要一个名为
library
的根元素,名为
cupboard
的子元素,名为
val\u c
state
的子元素,以及另一个名为
something
something 2
的元素。如果名称更有用(例如,如果是“城市”和“州”,而不是“val_c”和“州”),那么您可以根据名称的选择进行一些猜测。这些猜测当然可能是完全错误的


因为样式表不使用
xsl:apply-templates
,所以可以进行一些数据流分析,例如,计算出根模板中指定的随机值从未实际使用过(至少在您选择显示给我们的代码部分中没有)。但是XSLT通常不可能进行这种分析,因为大多数样式表都使用
xsl:apply templates
,如果不了解很多源文档结构,就无法对模板规则调用进行任何静态分析。

这是一项完全没有希望的任务,特别是如果您出于隐私原因对我们隐瞒部分XSLT代码,并且XSLT代码明显不正确(在关闭
后立即出现
xsl:when
元素)

这当然不是一项可以自动化的任务

您希望做的最好的事情就是计算出一些结构:样式表需要一个名为
library
的根元素,名为
cupboard
的子元素,名为
val\u c
state
的子元素,以及另一个名为
something
something 2
的元素。如果名称更有用(例如,如果是“城市”和“州”,而不是“val_c”和“州”),那么您可以根据名称的选择进行一些猜测。这些猜测当然可能是完全错误的


因为样式表不使用
xsl:apply-templates
,所以可以进行一些数据流分析,例如,计算出根模板中指定的随机值从未实际使用过(至少在您选择显示给我们的代码部分中没有)。但是XSLT通常不可能进行这种分析,因为大多数样式表都使用
xsl:apply-templates
,并且在不了解很多源文档结构的情况下,您无法对模板规则调用进行任何静态分析。

,您需要推断出它要运行的XML是什么?编程方面?我不知道这将解决什么问题(我很想知道),但这听起来不像是一项琐碎的任务。您打算用什么语言编写XML推断器?如果有帮助的话,我可以告诉您一些关于XSLT的事情。它递归地调用
checklibrary
。它试图匹配的任何东西,如果没有在模板中定义,都会在XML中找到。因此,
橱柜
状态
,以及名为
某物
的元素都是XML的一部分。(您已经获得了其中的大部分,但没有
状态
)。XML有可用的模式吗?这将比XSLT运行时对您的帮助大得多。@Ann.L。是的,你说得对。我正在使用xalan输入XML并对XSLT文件运行它。另外,xalan还有一些有用的特性,比如“-ttc”命令行选项,它允许我跟踪XSLT文件的处理过程。关于递归调用,您是正确的。我现在已经更新了XML。是的,我需要推导XML。现在不必通过编程来推导。我想更好地理解它,然后才能相应地生成它?编程方面?我不知道这将解决什么问题(我很想知道),但这听起来不像是一项琐碎的任务。您打算用什么语言编写XML推断器?如果有帮助的话,我可以告诉您一些关于XSLT的事情。它递归地调用
checklibrary
。它试图匹配的任何东西,如果没有在模板中定义,都会在XML中找到。因此,
橱柜
状态
,以及名为
某物
的元素都是XML的一部分。(您已经获得了其中的大部分,但没有
状态
)。XML有可用的模式吗?这将比XSLT运行时对您的帮助大得多。@Ann.L。是的,你说得对。我正在使用xalan输入XML并对XSLT文件运行它。此外,xalan还有一些有用的特性