Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / XML, XSL, XPath, XQuery Новый топик    Ответить
 Как в XSLT описать таблицу с переменным числом колонок?  [new]
Michael Hopgarden
Member

Откуда: Russia, Moscow
Сообщений: 64
Например, не выводить колонку если выполняется какое либо условие.
При этом удалить и заголовок колонки и пересчитать colspan, где требуется.
Условия могут быть разными. Например,
в колонке нет значений;
сумма всех значений в колонке не больше какой либо величины;
ни одно из значений в колонке не больше определенной величины;
условие зависит от состояния другой колонки в связанном периоде;
колонка просто находится в определенном периоде;
etc.
Для начала, скажем убрать колонку "зарезервировано" в "январе" из прилагаемого файла.

К сообщению приложен файл (xml-xsd-xslt.rar - 8Kb) cкачать
20 дек 18, 15:01    [21769652]     Ответить | Цитировать Сообщить модератору
 Re: Как в XSLT описать таблицу с переменным числом колонок?  [new]
vvvait
Member

Откуда:
Сообщений: 83
горизонтальный скроллинг - ЗЛО

чтобы убрать пустые колонки в заголовке я бы сделал так:
<xsl:key name="distinct" match="//interval" use="@name"/>
	<xsl:key name="distinct_int" match="//*[name(..) = 'interval']" use="concat(name(), '.', ../@name)"/>
	<misc:translate>
		<approved>утверждено</approved>
		<appr_per_total>%</appr_per_total>
		<reserved>зарезервировано</reserved>
		<resrv_per_total>%</resrv_per_total>
		<resrv_dev_appr>отклонение</resrv_dev_appr>
		<rda_per_appr>%</rda_per_appr>
		<consumed>истрачено</consumed>
		<consm_per_appr>%</consm_per_appr>
		<consm_dev_appr>отклонение</consm_dev_appr>
		<cda_per_appr>%</cda_per_appr>
		<to_pay>к оплате</to_pay>
	</misc:translate>
	<xsl:variable name="trans" select="document('')/*/misc:translate"/>
	<xsl:variable name="header" select="//interval[generate-id(.) = generate-id(key('distinct',@name))]"/>
	<!--XHTML document outline-->
	<xsl:template match="/">
		<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="ru">
			<head>
				<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
				<title>Рабочая смета</title>
				<link rel="stylesheet" type="text/css" href="stylesheet.css" />
			</head>
			<body>
				<h1>
          Рабочая смета 
					<xsl:value-of select="document/@company"/> за 
					<xsl:value-of select="document/@year"/> год по состоянию на 
					<xsl:value-of select="document/@actual_date"/>
				</h1>
				<table>
					<tr>
						<th rowspan="2"></th>
						<th rowspan="2">статья</th>
						<xsl:for-each select="$header">
							<xsl:variable name="intchld" select="//*[name(..) = 'interval'][generate-id(.) = generate-id(key('distinct_int',concat(name(), '.', ../@name)))][../@name = current()/@name]"/>
							<th colspan="{count($intchld)}">
								<xsl:value-of select="@name"/>
								<xsl:value-of select="count($intchld)"/>
							</th>
						</xsl:for-each>
					</tr>
					<tr>
						<xsl:for-each select="$header">
							<xsl:variable name="intchld" select="//*[name(..) = 'interval'][generate-id(.) = generate-id(key('distinct_int',concat(name(), '.', ../@name)))][../@name = current()/@name]"/>
							<xsl:for-each select="$intchld">
								<th>
									<xsl:value-of select="name(current())"/>
									<br/>
									<xsl:value-of select="$trans/*[name() = name(current())]"/>
								</th>
							</xsl:for-each>
						</xsl:for-each>
					</tr>
					<xsl:apply-templates/>
				</table>
			</body>
		</html>
	</xsl:template>


PS если есть возможность - желательно изменить структуру xml документа хотя-бы выводя все поля с пустыми значениями, и правильно сентябрь
21 дек 18, 18:13    [21770753]     Ответить | Цитировать Сообщить модератору
 Re: Как в XSLT описать таблицу с переменным числом колонок?  [new]
Michael Hopgarden
Member

Откуда: Russia, Moscow
Сообщений: 64
vvvait, спасибо.

Почему "горизонтальный скроллинг - ЗЛО" (© vvvait)?
Неэффективно, даже если скроллинг применяется однократно, или с точки зрения чтения(понимания) документа?

В чем ошибка структуры? Мне казалась, что она нормализована и корректна.

Простите за возможно наивные вопросы. Это мой первый опыт знакомства с xml-xslt.
24 дек 18, 10:54    [21771818]     Ответить | Цитировать Сообщить модератору
 Re: Как в XSLT описать таблицу с переменным числом колонок?  [new]
vvvait
Member

Откуда:
Сообщений: 83
Michael Hopgarden, много причин, например:
на мышках обычно нет горизонтальной прокрутки
печать такого документа будет затруднительна
при просмотре желательно фиксировать 1 столбец, сделать это с помощью html очень сложно

в xsl v1 нет нормальных инструментов для группировки, поэтому лучше готовить для него xml без необходимости группировок,
например вывести нужные колонки заголовка отдельно.

если отзеркалить отчет по диагонали будет удобнее

если отчет просматривается в браузере, можно использовать JS для редактирования DOM дерева после его загрузки
24 дек 18, 11:45    [21771857]     Ответить | Цитировать Сообщить модератору
 Re: Как в XSLT описать таблицу с переменным числом колонок?  [new]
Michael Hopgarden
Member

Откуда: Russia, Moscow
Сообщений: 64
vvvait, заказчик хочет видеть это именно в такой ориентации.

Поэтому единственный способ уменьшить простыню, это скрыть столбцы, не информативные по тем или иным причинам. Просмотр планируется исключительно в браузере при возможности редактировать или дополнительно обсчитывать в excel. Есть, правда, проблема редактирования в excel при открытии xml на сетевом ресурсе, теряется tmp файл... Будет копировать к себе, что я еще ему сделаю с одним SQL сервером.

И по вашему примеру у меня возник вопрос.
Как определить префикс пространства имен "misc"? По возможности внутри xslt. Хотя попытка создать еще один локальный xsd все равно ни к чему не привела.
24 дек 18, 15:22    [21772203]     Ответить | Цитировать Сообщить модератору
 Re: Как в XSLT описать таблицу с переменным числом колонок?  [new]
vvvait
Member

Откуда:
Сообщений: 83
Michael Hopgarden, там же где и все объявлены, в xsl:stylesheet
24 дек 18, 18:27    [21772364]     Ответить | Цитировать Сообщить модератору
Все форумы / XML, XSL, XPath, XQuery Ответить