У меня есть файл XSLT, и мне нужно сгенерировать соответствующий файл XML.Я не знаю точно, как должен выглядеть XML-файл, однако, основываясь на XSLT, мы можем догадаться, как это должно быть.
Мне нужна помощь, чтобы правильно понять XSLT, потому что я новичок в этом.
Как будет выглядеть XML-файл для приведенного ниже XSLT?
<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 должен выглядеть следующим образом:
Затем я могу написать код для автоматической генерации XML для данного XSLT этой формы.
Спасибо.