Работа с XML и XSL - PullRequest
       34

Работа с XML и XSL

3 голосов
/ 08 марта 2010

ПЕРВОЕ РЕДАКТИРОВАНИЕ
Я извлекаю тег Child 1 в DropDownList в форме C #, Plz предлагает лучший практический код (C #) для удаления тега Parent и всех его дочерних тегов в файле XML. Пример:

    <Parents>
      <Parent>
        <Child 1>Something</Child 1>
        <Child 2>Something</Child 2>
        <Child 3>Something</Child 3>
        <Child 4>Something</Child 4>
      </Parent>
      <Parent>
        <Child 1>Something 1</Child 1>
        <Child 2>Something 1</Child 2>
        <Child 3>Something 1</Child 3>
        <Child 4>Something 1</Child 4>
      </Parent>
    </Parents>

--- Предыдущий вопрос ---
Как я могу вставить следующий тег таблицы стилей в мой новый XML-файл, созданный с использованием кода C # ????

<?xml-stylesheet type="text/xsl" href="issuez.xsl"?>

C # код для создания XML-файла: -

new XDocument(
                        new XElement("issues",
                            new XElement("issue",
                            new XElement("cat", comboBox1.Text),
                            new XElement("desc", richTextBox1.Text),
                            new XElement("end", dateTimePicker1.Text),
                            new XElement("att", textBox2.Text)
                            )
                        )
                        ).Save(path);

Ответы [ 4 ]

4 голосов
/ 09 марта 2010

Во-первых, убедитесь, что даты в вашем XML представлены в каноническом формате ГГГГ-ММ-ДД, а время в формате ЧЧ: ММ: СС, чтобы XSLT (который в версии 1.0 не имел типов данных даты или времени ) можно сравнить и отсортировать их.

Во-вторых, используйте технику Стива Мюнха для группировки. Вы генерируете ключ на даты предметов, используя xsl:key. Затем можно использовать функцию key(), чтобы найти список всех элементов на определенную дату.

Используя этот ключ, вы можете составить список отдельных дат, которые появляются в элементах. Это мюнхенская техника: найдите каждый элемент, который является первым элементом в списке, который key () возвращает для даты этого элемента. Этот метод гарантирует, что вы всегда получаете один и только один элемент для каждого отдельного значения даты. Затем вы сортируете эти предметы и используете их даты для определения фактического производства вашей продукции.

Минимальный пример:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:key name="dates" match="/data/newsitem" use="@date"/>

  <xsl:template match="/">
    <output>
      <!-- find exactly one newsitem node for each distinct @date in the document -->
      <xsl:for-each select="/data/newsitem[generate-id() = generate-id(key('dates', @date)[1])]">
        <xsl:sort select="@date" order="descending"/>
        <xsl:call-template name="newsitems_for_date">
          <xsl:with-param name="date" select="@date"/>
        </xsl:call-template>
      </xsl:for-each>
    </output>
  </xsl:template>

  <xsl:template name="newsitems_for_date">
    <xsl:param name="date"/>
    <h1>
      <xsl:value-of select="$date"/>
    </h1>
    <xsl:apply-templates select="/data/newsitem[@date=$date]">
       <xsl:sort select="@time" order="descending"/>
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="newsitem">
    <p>
      newsitem for <xsl:value-of select="@date"/>
    </p>
  </xsl:template>

</xsl:stylesheet>
2 голосов
/ 08 марта 2010

Это та вещь, которую должен обрабатывать сервер, создающий XML. XSLT не лучшее место для большого количества логики. Лучше встраивать все это в XML после того, как вы запросите новости. Просто отправьте их клиенту в нужной форме, чтобы им не приходилось так усердно работать.

1 голос
/ 08 марта 2010

Таблица стилей XSLT допускает глобальные параметры, которые можно установить перед выполнением преобразования. Так, с помощью XSLT 1.0 и XslCompiledTransform .NET, если вам нужна текущая дата в вашей таблице стилей, вы можете определить глобальный параметр

  <xsl:param name="current-date"/>

и установите его перед запуском преобразования, создав XsltArgumentList, установите для параметра значение и формат, который вы хотите / нуждаетесь , а затем передайте этот XsltArgumentList в качестве второго аргумента методу Transform. Затем в таблице стилей вы можете сравнить дату в элементе или атрибуте ввода XML с параметром.

Поскольку вы используете .NET, другой вариант - использовать XSLT 2.0; Microsoft не поддерживает это, но с Saxon 9 существует стороннее решение. В XSLT / XPath 2.0 есть функция с именем current-date , поэтому вам не нужен параметр.

0 голосов
/ 08 марта 2010

Если вы используете процессор XSLT из PHP, вы можете использовать функции PHP внутри вашего XSLT-скрипта. Все, что вам нужно, это вызвать registerPhpFunctions перед преобразованием. Значение результата в правильном порядке можно использовать для сортировки.

...