Генерация XML для данного XSLT - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть файл 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 этой формы.

Спасибо.

1 Ответ

0 голосов
/ 29 декабря 2018

Это совершенно безнадежная задача, особенно если вы скрываете от нас части кода XSLT по соображениям конфиденциальности и если код XSLT явно неверен (элемент xsl:when сразу после закрывающего </xsl:stylesheet> ???)

Это определенно не та задача, которую когда-либо можно было бы автоматизировать.

Лучшее, на что вы можете надеяться, это проработать некоторую структуру: таблица стилей ожидает корневой элемент с именем library, потомки, называемые cupboard, и дочерние элементы, именуемые val_c и state, и другие элементы, называемые something и something2.Если бы имена были более полезными (например, если это были «город» и «штат», а не «val_c» и «штат»), то вы могли бы сделать некоторые предположения, основываясь на выборе имен.Эти предположения, конечно, могут быть совершенно неверными.

Поскольку таблица стилей не использует xsl:apply-templates, можно немного проанализировать поток данных и, например, определить, что случайные значения назначены вкорневой шаблон фактически никогда не используется (по крайней мере, в той части кода, которую вы выбрали, чтобы показать нам).Но такой анализ обычно не представляется возможным с XSLT, потому что большинство таблиц стилей действительно используют xsl:apply-templates, и вы не можете проводить статический анализ вызова правил шаблона, не зная много о структуре исходного документа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...